Od samého začiatku jazyka Java prešiel veľa zmien, ktoré samozrejme priniesli pozitívne momenty vo svojej funkčnosti. Jednou z takých dôležitých zmien je zavedenie Java Generic alebo generalizácie. Táto funkcia spôsobila, že jazyk je nielen flexibilnejší a všestranný, ale aj oveľa bezpečnejší z hľadiska prinášania dátových typov.
Java Zovšeobecnenie: popis a príklad
Upozornenie: Začínajúc ôsmou verziou jazyka Java, pričom pri deklarovaní odkazu zadáte cieľový typ, rohové zátvorky v konštruktore môžu zostať prázdne. Takže príklad uvedený vyššie môže byť prepísaný nasledovne: Pair obj = new Pair & lt; & gt; (). Keď je trieda deklarovaná týmto spôsobom, môžete použiť tento list vo svojom tele namiesto špecifických typov polí, odkazov a návratových metód objektov. Od T, keď je objekt triedy nahradený určitým typom, prvé a druhé políčko v tomto prípade budú mať celé číslo. Podľa logiky by argumenty firstItem a secondItem, odovzdané príslušnému konštruktoru, mali mať aj typ Integer alebo jeho podtriedy. Ak sa pokúsite odoslať typ údajov, ktorý sa líši od toho, čo bolo špecifikované pri vytváraní objektu, kompilátor túto chybu nezmeškal. Takže konštruktér s argumentmi pri vytváraní objektu bude vyzerať takto: Pair obj = new Pair & lt; & gt; (nové celé číslo
, nové celé číslo
). To isté platí pre argumenty setFirst a setSecond methods. A ako ste pravdepodobne uhádli, getFirst a getSecond vrátia celočíselné hodnoty.
V generalizovaných triedach je tiež možné deklarovať niekoľko parametrov typu, ktoré sú uvedené v rohových zátvorkách čiarou. Pre tento prípad je trieda Pair uvedená na obrázku nižšie.
Ako môžeme vidieť, pri vytváraní inštancie takejto triedy v rohových zátvorkách by sa mal uviesť počet typov ako parametre. Ak ste oboznámení s takouto štruktúrou údajov, ako je mapa, možno ste si všimli, že tampoužíva sa presne ten istý princíp. Prvý argument definuje typ kľúča a druhý typ hodnoty. Treba poznamenať, že typy prenášané pri vytváraní objektu argumentov sa môžu zhodovať. Áno, nasledujúce vyhlásenie o inštancii triedy Pair je úplne správne: Pair obj.
Predtým, než sa postupuje, treba poznamenať, že kompilátor jazyka Java nevytvára žiadne iné verzie triedy Pair. V skutočnosti sa v procese kompilácie odstránia všetky informácie o všeobecnom type. Namiesto toho sa príslušné typy vykonajú vytvorením špeciálnej verzie triedy Pair. Avšak v samotnom programe, ako predtým, existuje jedna generalizovaná verzia tejto triedy. Tento proces sa nazýva typ Java Generic Cleanup. Zoberme si na vedomie dôležitý bod. Odkazy na rôzne verzie tej istej generickej triedy jazyka java nemôžu smerovať na ten istý objekt. To znamená, že máme dva referencie: Pair obj1 a Pair obj2. Takže chyba obj1 = obj2 sa vyskytne. Hoci obe premenné patria do typu Pair, objekty, na ktoré odkazujú, sú odlišné. Je to živý príklad generickej bezpečnosti Java.
Je dôležité vedieť, že zovšeobecnenia sa môžu vzťahovať iba na referenčné typy, to znamená, že sa odovzdávajú argumentu generickej javy triedy, argument musí byť nutne typu triedy. Takéto jednoduché typy, ako napríklad dlhé alebo dvojité, sa nedajú preniesť. Inými slovami, nasledujúci riadok vyhlásenia triedy Pare je neplatný: Pair obj. Toto obmedzenie však nepredstavuje vážny problém, ako v prípade Java pre všetkýchPrimárny typ je zodpovedajúci shell-shell. Prísne vzaté, ak chcete Pair trieda ynkapsulyrovat celočíselné a logickú, avtoupakovka urobí všetko za vás: Pár obj = new Pair & lt; & gt; (25 pravda).
Ešte závažnejším obmedzením je nemožnosť vytvoriť inštanciu parametra typu. Takže nasledujúci riadok spôsobí chybu kompilácie: T first = new T (). To je zrejmé, pretože neviete vopred, či argument prešiel kompletnou triedu alebo abstraktné, alebo dokonca rozhranie. To isté platí pre vytváranie polí.
Veľmi často sú situácie, kedy je nutné obmedziť typy, ktoré môžu byť odovzdané ako argument pre Java všeobecný triedy. Predpokladajme, že v našej triede Pair chceme zapuzdriť iba číselné hodnoty pre ďalšie matematické operácie nad nimi. Aby sme to urobili, musíme určiť hornú hranicu parametra typu. Realizovaný rodičovskej reklamy, ktoré dedia všetky argumenty odovzdané do lomených zátvoriek. Toto bude vyzerať takto: dvojica tried. Týmto spôsobom kompilátor vie, že namiesto parametra T môže vystaviť číslo alebo triedu alebo jednu z jej podtriedy. Toto je spoločný príjem. Tieto obmedzenia sa často používajú na zabezpečenie kompatibility parametrov typu v tej istej triede. Zvážte príklad v páre dvojice tried Pair: class pair. Tu sa povedať kompilátora, že typ T môže byť ľubovoľný, a typ V musia byť typu T alebo niektorej z jej podtriedy. Obmedzenie "dole" je úplne rovnaké, ale namiesto rozšírení slov je napísané slovoSuper. To znamená, že vyhlásenie triedy Pair hovorí, že namiesto T môže byť nahradený ArrayList alebo akákoľvek trieda alebo užívateľ, ktorý zamestnáva.
V Java sa môžu generalizácie aplikovať nielen na triedy, ale aj na metódy. Takže všeobecnú metódu možno deklarovať v bežnej triede.
Ako je zrejmé z vyššie uvedeného obrázku, v oznámení o všeobecnej metóde nie je nič zložité. Pred výpočtovou metódou postačí stať rohové zátvorky a špecifikovať v nich parametre typov. V prípade konštruktéra sa všetko robí rovnakým spôsobom:
Rohové konzoly sa v tomto prípade označujú názvom konštruktora, pretože nevrátia žiadny význam. Výsledok obidvoch programov bude: Integer String
Všeobecná trieda s viacerými typmi parametrov
Niektoré funkcie zovšeobecnení
Limity uložené na všeobecné triedy
Ešte závažnejším obmedzením je nemožnosť vytvoriť inštanciu parametra typu. Takže nasledujúci riadok spôsobí chybu kompilácie: T first = new T (). To je zrejmé, pretože neviete vopred, či argument prešiel kompletnou triedu alebo abstraktné, alebo dokonca rozhranie. To isté platí pre vytváranie polí.