/ / Generics Java: popis a metody

Generika jazyka Java: Popis a metody

Od samotného vzhledu jazyka Java prošelmnoho změn, které nepochybně přinesly pozitivní momenty jeho funkčnosti. Jednou takovou smysluplnou změnou je zavedení Java Generic nebo generalizace. Tato funkčnost způsobila, že jazyk je nejen flexibilnější a všestrannější, ale také mnohem bezpečnější, pokud jde o snížení datových typů.

java generika popis

Faktem je, že před zavedením generických generikkód v jazyce Java může být vytvořen pouze odkazem na typ objektu. Takové odkazy mohou být přiřazeny jakémukoli objektu. Koneckonců, všechny třídy v jazyce Java jsou implicitními potomky třídy Object. Nicméně, tento přístup je potenciálním zdrojem mnoha chyb souvisejících s typy cenných papírů v zdánlivé přeměny objektu z objektu do cílového typu. Při použití zobecnění všechny hody se provádějí implicitně a automaticky, což eliminuje i potenciál pro chyby.

Generika jazyka Java: popis a příklad

Vezměme si jednoduchý příklad uplatnění zobecnění na obvyklou třídu na následujícím obrázku. A teprve poté přistoupíme k podrobnému zkoumání všech jemností a nuancí Java Generic.

obecná třída java

Všimněte si, jakOznámení třídy dvojice. Okamžitě za názvem třídy se otevře úhelník, ve kterém je označeno písmeno T. Je to druh zástupného symbolu, který bude při vytváření instance této třídy nahrazen určitým typem. Vypadá to takto: Pair <Integer> obj = new Pair <Integer> (). Je třeba poznamenat, že namísto T můžete určit libovolné písmeno, ale zpravidla použijte T, V nebo E.

Poznámka: počínaje osmou verzí jazyka Java a zadáním cílového typu při deklarovaném odkazu, můžete ponechat úhelníky v konstruktoru prázdné. Takže výše uvedený příklad lze přepsat takto: Pair <Integer> obj = nový pár <> ().

Když je třída deklarována tímto způsobem, pak ve svéTento dopis můžete použít místo konkrétních typů polí, odkazů a metod vrácených metodami. Protože T je při vytváření objektu třídy nahrazen určitým typem, první a druhé pole v tomto případě budou typu Integer.

Podle logiky argumenty firstItem a secondItem,předaný příslušnému konstruktoru, musí být také typu Integer nebo jeho podtřídy. Pokud se pokusíte předat datový typ, který se liší od zadaného při vytváření objektu, kompilátor tuto chybu přeskočí. Takže konstruktor s argumenty při vytváření objektu bude mít následující formu: Pair <Integer> obj = new Pair <> (nové Integer (1), nové Integer (2)). Totéž platí pro argumenty pro metody setFirst a setSecond. A jak jste pravděpodobně již uhádli, metody getFirst a getSecond vrátí hodnoty typu Integer.

Obecná třída s několika typovými parametry

Zevšeobecňujícími tříd mohou také deklarovat více parametry typu, které jsou stanoveny v hranatých závorkách s čárkou. Třída Pair pro tento případ je uvedena na obrázku níže.

java generika

Jak vidíte, při vytváření instance takové třídyV úhlových závorách musíte zadat stejný počet typů jako parametry. Pokud jste obeznámeni s takovou strukturou dat, jako je mapa, možná si všimnete, že se zde používá stejný princip. První klíč určuje typ klíče a druhý - typ hodnoty. Je třeba poznamenat, že typy argumentů předávaných vytvoření objektu mohou být stejné. Takže následující deklarace instance třídy Pair je naprosto správná: Pair <String, String> obj.

Některé funkce zobecnění

Předtím, než pokračujeme, je třeba poznamenatKompilátor jazyka Java nevytváří žádné jiné verze třídy Pair. Ve skutečnosti jsou během procesu kompilace odstraněny všechny informace o generickém typu. Namísto toho jsou obsazovány odpovídající typy, čímž vznikne speciální verze třídy Pair. Samotný program však má ještě jednu generalizovanou verzi této třídy. Tento proces je nazýván v jazyce Java generic type cleaning.

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 <Integer> obj1 a Pair <Double> obj2. Proto dojde k chybě v řádku obj1 = obj2. Přestože obě proměnné jsou typu Pair <T>, objekty, na které odkazují, jsou různé. Jedná se o živý příklad zabezpečení typů v Javě Generic.

Omezení obecných tříd

Je důležité vědět, že lze použít zobecněnípouze na referenční typy, tj. argument předaný parametru generické třídy parametru java musí být typ třídy. Takové jednoduché typy, například dvojité nebo dlouhé, nemohou být přenášeny. Jinými slovy, následující řádek deklarace třídy Pair není platný: Pair <int> obj. Toto omezení však není vážným problémem, protože Java má odpovídající třídu obalů pro každý primitivní typ. Přesně řečeno, pokud chcete zapsat celé číslo a logickou hodnotu ve třídě Pair, auto-pack udělá vše pro vás: Pair <Integer, Boolean> obj = nový pár <> (25, true).

Dalším závažným omezením jenemožnost vytvořit instanci parametru typu. Následující řádek způsobí chybu kompilace: T first = new T (). Je to zřejmé, protože předem nevíte, zda bude jako argument argumentace úplné nebo abstraktní. Totéž platí pro vytváření polí.

Omezené typy

Docela často existují situace, kdyJe nutné omezit seznam typů, které lze předat jako argument generické třídě java. Předpokládejme, že v třídě Pair chceme zapouzdřit výhradně číselné hodnoty pro další matematické operace na nich. Chcete-li to provést, musíme nastavit horní hranici parametru typu. Toto je implementováno pomocí deklarace nadklasy, kterou dědí všechny argumenty předané v úhlových závorkách. Bude to vypadat takto: třída Pair <T rozšiřuje číslo>. Tímto způsobem se kompilátor dozví, že místo parametru T můžete nahradit buď třídu Number nebo jednu ze svých podtříd.

To je běžná technika. Tato omezení se často používají k zajištění kompatibility parametrů typu ve stejné třídě. Zvažte příklad na třídě Pair: třída Pair <T, V extends T>. Zde řekneme kompilátoru, že typ T může být libovolný a typ V musí být buď typ T, nebo jedna z jeho podtříd.

Omezení "zespodu" nastává přesně stejnétak či onak, ale namísto slova rozšiřuje, aby bylo patrné slovo Super. Která je klasifikována třídou Pair <T Super ArrayList> říká, že namísto T může být nahrazena nebo ArrayList nebo jakoukoliv třídu nebo rozhraní, které dědí.

Generické metody Java a konstruktory

V jazyce Java lze generalizovat nejen s ohledem na třídy, ale i metod. Takže obecná metoda může být deklarována v běžné třídě.

obecné java metody

Jak je vidět na obrázku výše, není ve vyhlášení všeobecné metody nic složitého. Stačí zadat úhly závorky před návratovou metodou a zadat v nich typové parametry.

V případě konstruktoru se vše dělá stejným způsobem:

java generické čištění

Úhelové konzoly v tomto případě jsou umístěny před jménem konstruktoru, protože nevracejí žádnou hodnotu. Výsledkem práce obou programů bude:

Integer

Řetězec

</ p>>
Přečtěte si více: