Általános típusok

Az általános típus egy általános osztály vagy felület, amelyet típusok felett paramétereznek. A következő Box osztály módosul a koncepció bemutatására.

Egyszerű Box osztály

Kezdje egy nem általános Box osztály vizsgálatával, amely bármilyen típusú objektumon működik. Csak két metódust kell megadnia: a set, amely objektumot ad a dobozhoz, és a get, amely lekéri:

Mivel a metódusai elfogadnak vagy visszaküldnek egy objektumot, szabadon átadhatod, amit csak akar , feltéve, hogy nem tartozik a primitív típusok közé. Fordításkor nincs mód az osztály használatának ellenőrzésére. A kód egyik része Integert helyezhet a mezőbe, és elvárhatja, hogy kiszabadítsa belőle az egész számokat, míg a kód egy másik része tévesen adhat át egy karakterláncot, ami futásidejű hibát eredményezhet.

Általános verzió a Box osztály

Egy általános osztályt a következő formátumban definiálunk:

class name<T1, T2, ..., Tn> { /* ... */ }

A Box osztály az általános használat érdekében létrehoz egy általános típusdeklarációt a „public class Box” kód megváltoztatásával „public class Box < T > “. Ez bemutatja a T típusú változót, amely bárhol használható az osztályon belül.

Ezzel a változtatással a Box osztály:

Amint láthatja, az Object minden előfordulása T. típusú változó lehet. Bármely nem primitív típus, amelyet Ön megadhat: bármely osztálytípus, interfésztípus, tömbtípus vagy akár egy másik típusú változó.

Ugyanez a technika alkalmazható létrehozáshoz általános felületek.

Típusparaméter-elnevezési konvenciók

Megállapodás szerint a típusparaméterek nevei egyesek, nagybetűk. Ez szöges ellentétben áll a változó elnevezési szokásokkal, amelyekről Ön már tud, és jó okkal: E konvenció nélkül nehéz lenne megkülönböztetni a típusváltozót a közönséges osztály vagy felületnév között.

A leggyakrabban használt típusparaméterek a következők:

  • E – Element (a Java Gyűjtemények keretein belül széles körben használják)
  • K – Kulcs
  • N – Szám
  • T – Típus
  • V – Érték
  • S, U, V stb. – 2., 3., 4. típus

Ezeket a neveket a Java SE API-ban és a lecke többi részében is látni fogja.

Általános típus meghívása és kezdeményezése

Az általános Box osztályra való hivatkozás a kódon belül el kell végeznie egy általános típusú meghívást, amely a T-t valamilyen konkrét értékkel helyettesíti, például az Integer értéket:

Box<Integer> integerBox;

Úgy gondolhat, hogy egy általános típusú invokáció hasonló a szokásos metódushíváshoz, de ahelyett, hogy argumentumot adna át am ethod, egy típus argumentumot – ebben az esetben egész számot – ad át magának a Box osztálynak.

Típusparaméter és Típus argumentum terminológia: Sok fejlesztő felváltva használja a “type paraméter” és a “type argument” kifejezéseket, de ezek a kifejezések nem ugyanazok. Kódoláskor egy paraméter argumentumot ad meg egy paraméterezett típus létrehozása érdekében. Ezért a T a Foo < T > típusparaméter, és a karakterlánc a Foo < String > f egy típusú argumentum. Ez a lecke figyelembe veszi ezt a meghatározást, amikor ezeket a kifejezéseket használja.

Mint minden más változó deklaráció, ez a kód sem hoz létre új Box objektumot. Egyszerűen kijelenti, hogy az integerBox hivatkozást tartalmaz egy “Box of Integer” -re, így olvasható a < Integer > mező.

Egy általános típusú meghívást általában paraméterezett típusnak nevezünk.

Az osztály példányosításához használja a szokásos módon az új kulcsszót, de helyezze el a következőt: < Egész osztály > az osztály neve és a zárójel között:

Box<Integer> integerBox = new Box<Integer>();

A gyémánt

A Java SE 7 és újabb verzióiban az általános osztály konstruktorának meghívásához szükséges típusú argumentumokat egy üres típusú argumentumokkal helyettesítheti (< >) mindaddig, amíg a fordító a kontextusból meg tudja állapítani vagy kikövetkeztetheti a típus argumentumokat. Ezt a pár sarok zárójelet, < >, informálisan gyémántnak nevezzük. Például létrehozhatja a < Egész > mező példányát a következő állítással:

Box<Integer> integerBox = new Box<>();

A gyémánt jelöléssel és a típus következtetésével kapcsolatos további információkért lásd: Típus megkötés.

Több típusú paraméter

Amint azt korábban említettük, egy általános osztálynak több típusú paramétere lehet.Például az általános OrderedPair osztály, amely megvalósítja az általános Pair felületet:

A következő utasítások két példányt hoznak létre a OrderedPair osztályból:

A kód, új OrderedPair < Karakterlánc, egész >, K karakterláncként, V pedig egész számként példányosítja. Ezért a OrderedPair konstruktorának paramétertípusai a String, illetve az Integer. Az autoboxolás miatt érvényes, ha egy Stringet és egy int-t adunk át az osztálynak.

Amint azt a The Diamond is említette, mert egy A Java fordító a K és V típusokra következtethet a OrderedPair < String, Integer > deklarációból, ezek az utasítások gyémánt jelöléssel rövidíthetők:

OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);OrderedPair<String, String> p2 = new OrderedPair<>("hello", "world");

Általános felület létrehozásához kövesse ugyanazokat a szokásokat, mint egy általános osztály létrehozásakor.

Paraméteres típusok

OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...));

Write a Comment

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük