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.
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>(...));