Java generalizace: popis a metody

Od samého začátku jazyka Java prošla řada změn, které samozřejmě přinesly pozitivní momenty ve své funkčnosti. Jednou takovou důležitou změnou je zavedení Java Generic nebo generalizace. Tato funkce učinila jazyk nejen flexibilnějším a více univerzálním, ale také mnohem bezpečnějším, pokud jde o přenášení datových typů.

Faktem je, že před zavedením generik, generalizovaný kód v jazyce Java by mohl být vytvořen pouze pomocí odkazů jako Object. Takové odkazy mohou být přiřazeny jakémukoli objektu. Koneckonců, všechny třídy Java jsou implicitní dědicové třídy třídy Object. Tento přístup je však potenciálním zdrojem mnoha typů chyb souvisejících s bezpečností, když explicitně přeměňuje objekt objektu na cílový typ. Při použití zobecnění jsou všechna nastavení prováděna implicitně a automaticky, což vylučuje i možnou možnost chyb.


Java generalizace: popis a příklad

Podívejme se na jednoduchý příklad uplatnění zobecnění na obvyklou třídu na obrázku níže. A pak budeme pokračovat v podrobném zvážení všech nuancí a nuancí Java Generic.
Věnujte pozornost tomu, jak se deklaruje dvojice. Ihned za názvem třídy se zobrazí rohové závorky, ve kterých je uvedeno písmeno T. Je to druh zástupného symbolu, který v procesu vytváření instance této třídy bude nahrazen určitým typem. Vypadá to takto: Pair obj = new Pair (). Je třeba poznamenat, že namísto T můžete určit libovolný dopis,použijte T, V nebo E.


Poznámka: Počínaje ôsmou verzí jazyka Java, při určení typu odkazu lze určit rohové závorky v konstruktoru prázdné. Takže výše uvedený příklad lze přepsat následovně: Pair obj = new Pair & lt; & gt; (). Když je tato třída deklarována tímto způsobem, můžete použít tento dopis v jeho těle místo konkrétních typů polí, odkazů a metod návratu objektů. Protože T, když je objekt třídy nahrazen určitým typem, bude první a druhé pole v tomto případě mít celočíselný typ. Podle logiky by argumenty firstItem a secondItem, předané příslušnému konstruktoru, měly mít také typ Integer nebo jeho podtřídy. Pokud se pokusíte odeslat typ dat, který se liší od zadaného při vytváření objektu, kompilátor tuto chybu chybí. Takže konstruktor s argumenty při vytváření objektu bude vypadat takto: Pair obj = new Pair & lt; & gt; (nové celé číslo

, nové celé číslo

). Totéž platí pro argumenty setFirst a setSecond methods. A jak jste pravděpodobně uhádli, getFirst a getSecond vrátí celočíselné hodnoty.

Obecná třída s několika typy parametrů

V generalizovaných třídách je také možné deklarovat několik parametrů typu, které jsou uvedeny v rohových závorkách čárkou. V tomto případě je třída Pair uvedena na následujícím obrázku.
Jak můžeme vidět, při vytváření instance takové třídy v rohových závorkách by měl být uveden počet typů jako parametry. Pokud jste obeznámeni s tímto druhem datové struktury, jako je mapa, možná jste si toho všimlipoužívá se přesně stejný princip. První argument definuje typ klíče a druhý typ hodnoty. Je třeba poznamenat, že typy přenášené při vytváření objektu argumentů se mohou shodovat. Ano, následující deklarace instance třídy Pair je naprosto správná: Pair obj.

Některé funkce zobecnění

Předtím, než začnete, je třeba poznamenat, že kompilátor Java nevytváří žádné jiné verze třídy Pair. Ve skutečnosti jsou v procesu kompilace odstraněny všechny informace o generalizovaném typu. Místo toho se odpovídající typy provádějí vytvořením speciální verze třídy Pair. V samotném programu, stejně jako předtím, existuje jedna všeobecná verze této třídy. Tento proces se nazývá typ Java Generic Cleanup. Uvědomme si důležitý bod. Odkazy na různé verze stejné generické třídy java nesmějí odkazovat na stejný objekt. To znamená, že máme dva odkazy: Pair obj1 a Pair obj2. Objeví se tedy chyba obj1 = obj2. Přestože obě proměnné patří do typu Pair, objekty, na které odkazují, jsou různé. Jedná se o živý příklad generické bezpečnosti Java.

Meze uložené na generalizovaných třídách

Je důležité vědět, že generalizace se mohou vztahovat pouze na referenční typy, tj. Jsou předávány argumentu obecné třídy java, argument nutně musí být typu třídy. Takové jednoduché typy, jako například například dlouhé dvojité, nelze přenášet. Jinými slovy, následující řádek prohlášení třídy Pare je neplatný: Pair obj. Toto omezení však nepředstavuje vážný problém, jako v Javě pro všechnyPrvotní typ je odpovídající třída shell. Přísně řečeno, pokud chcete zařadit celou a logickou hodnotu do třídy Pair, automatické balení provede vše pro vás: Pair obj = new Pair & lt; & gt; (25 pravda).
Dalším závažnějším omezením je nemožnost vytvořit instanci parametru typu. Takže následující řádek způsobí chybu kompilace: T first = new T (). Je to zřejmé, protože předem nevíte, zda je argument předán plnohodnotné třídě nebo abstraktu nebo zcela rozhraní. Totéž platí pro vytváření polí.

Omezené typy

Docela často existují situace, kdy je potřeba omezit seznam typů, které mohou být předávány jako java generický argument. Předpokládejme, že v třídě Pair chceme zapsat pouze číselné hodnoty pro další matematické operace nad nimi. K tomu je třeba zadat horní limit parametru typu. Toto je realizováno pomocí oznámení nadtřídy, která je děděna všemi argumenty přenášenými v úhlových závorkách. Toto bude vypadat takto: třída Pair. Tímto způsobem se kompilátor dozví, že namísto parametru T lze nahradit buď třídu Number nebo jednu ze svých podtříd. To je společný příjem. Tato omezení se často používají k zajištění kompatibility parametrů typu ve stejné třídě. Zvažte příklad v páru třídy Pair: class pair. Zde řekneme kompilátoru, že typ T může být libovolný a typ V musí nutně být typu T nebo jedné z jeho podtříd. "Spodní" omezení je úplně stejné, ale namísto rozšíření o slovo je napsáno slovosuper To znamená, že prohlášení třídy Pair říká, že místo T může být nahrazen ArrayList nebo jakákoli třída nebo uživatel, který zaměstnává.

Generické metody Java a konstruktory

V jazyce Java lze generalizaci aplikovat nejen na třídy, ale i na metody. Takže obecná metoda může být deklarována v pravidelné třídě.
Jak je zřejmé z výše uvedeného obrázku, není ve sdělení obecné metody nic složitého. Ještě před výpočtovou metodou stačí dát rohové závorky a specifikovat v nich parametry typů. V případě konstruktoru se vše dělá stejným způsobem:
Rohové konzoly v tomto případě odkazují na jméno konstruktora, protože nevracejí žádný význam. Výsledkem obou programů bude: Integer String

Související publikace