Java generalizácia: popis a metódy

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.

Faktom je, že pred zavedením generík by mohol byť generalizovaný kód v jazyku Java vytvorený len pomocou odkazov ako Object. Takéto odkazy možno priradiť akémukoľvek objektu. Koniec koncov, všetky triedy v jazyku Java sú implicitnými dedičmi triedy Object. Tento prístup je však potenciálnym zdrojom mnohých typov chýb súvisiacich s bezpečnosťou, keď explicitne transformuje objekt objektu na cieľový typ. Pri použití zovšeobecnení sú všetky úpravy vykonávané implicitne a automaticky, čo vylučuje aj možnú možnosť chýb.


Java Zovšeobecnenie: popis a príklad

Pozrime sa na jednoduchý príklad použitia zovšeobecnení na zvyčajnú triedu na obrázku nižšie. A potom sa budeme podrobne zaoberať všetkými nuansami a nuansami Java Generic.
Venujte pozornosť tomu, ako sa deklaruje dvojica. Ihneď za názvom triedy sa zobrazia rohové zátvorky, v ktorých je uvedené písmeno T. Je to druh zástupného symbolu, ktorý sa v procese vytvárania inštancie tejto triedy nahradí špecifickým typom. Vyzerá to takto: Pair obj = new Pair (). Treba poznamenať, že namiesto T môžete špecifikovať akýkoľvek list, ale spravidla,použite T, V alebo E.


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šeobecná trieda s viacerými typmi parametrov

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.

Niektoré funkcie zovšeobecnení

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.

Limity uložené na všeobecné triedy

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í.

obmedzené druhy

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.

Generické metódy Java a konštruktory

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

Súvisiace publikácie