nisfarm.ru

Generika jazyka Java: Popis a metody

Od svého vzniku jazyk Java prošel mnoha změnami, což nepochybně přineslo pozitivní vlastnosti 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 generik, generický kód v Javě by mohl 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. Tento přístup je však potenciálním zdrojem mnoha typů chyb zabezpečení, pokud explicitně převedete objekt z objektu na cílový typ. Při použití zobecnění se všechny casty provádějí implicitně a automaticky, což vylučuje i možnost výskytu chyb.

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, jak je deklarována třída Pair. 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: Pár obj = nový pár< 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 ôsmou verzí jazyka Java, při zadání odkazu na cílový typ můžete ponechat úhelníky v konstruktoru prázdné. Takže výše uvedený příklad lze přepsat následovně: Pár obj = nový pár<> ().




Když je tato třída deklarována tímto způsobem, pak v tomto těle můžete namísto konkrétních typů polí, odkazů a metod vrácených metodami použít tento dopis. 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 argumentů a firstItem secondItem, postoupeny příslušnému konstruktoru musí být typu Integer nebo podtřídy. Pokusíte-li se vysílat datový typ, který je odlišný od toho, co bylo určeno při vytváření objektu, kompilátor nenechá tuto chybu. Takže konstruktor s argumenty při vytváření objektu bude mít následující podobu: Pár obj = nový pár<> (nové celé číslo (1), nové celé číslo (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

V obecných třídách můžete také deklarovat několik typových parametrů, které jsou zadány v úhlových závorcích oddělených čárkami. Třída Pair pro tento případ je uvedena na obrázku níže.

java generika

Jak je vidět, při vytváření instance takové třídy v úhlových závorkách by měl být zadán 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 obj.

Některé funkce zobecnění

Předtím, než postupujeme dále, je třeba poznamenat, že překladač 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 dvě vazby: Pár obj1 a pár obj2. Proto dojde k chybě v řádku obj1 = obj2. Přestože obě proměnné jsou typu Pair, objekty, kterých se týkají, se liší. Jedná se o živý příklad zabezpečení typů v jazyce Java Generic.

Omezení obecných tříd

Je důležité vědět, že zobecnění lze aplikovat pouze na referenční typy, které je předat parametry generických tříd java argument musí být typu třídy. Takové jednoduché typy, například dvojité nebo dlouhé, nemohou být přenášeny. Jinými slovy, následující řádek prohlášení třídy Pair není platný: Pár 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 ve třídě Pair chcete zaplnit celočíselnou a logickou hodnotu, auto-pack udělá vše pro vás: Pair obj = new Pair<> (25, true).

Dalším závažným omezením je nemož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, kdy je nutné omezit seznam typů, které mohou být předány jako argument do generické třídy 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í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 naší třídě Pair: class Pair. 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" se vyskytuje přesně stejným způsobem, ale místo slova se rozšiřuje slovo super. To je třída Pair říká, že namísto T může být nahrazen buď ArrayList, nebo nějaká třída 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

Sdílet na sociálních sítích:

Podobné
© 2021 nisfarm.ru