Java Generics - vs.
1. Áttekintés
Ebben a gyors bemutatóban meglátjuk a hasonlóságok és különbségek és a Java Generics-ben.
Ez azonban egy előrehaladott téma, ezért elengedhetetlen, hogy alaposan megértsük a témát, mielőtt belemerülnénk az ügy lényegébe.
2. A generikumok háttere
A fordítási időbeli hibák kiküszöbölése és a típusbiztonság megerősítése érdekében a JDK 5-ben bevezették a generikus gyógyszereket. Ez az extra típusú biztonság bizonyos felhasználási esetekben kiküszöböli az öntést, és feljogosítja a programozókat általános algoritmusok írására, amelyek mindkettő olvashatóbb kódhoz vezethetnek.
Például a JDK 5 előtti állapotban casting segítségével kell dolgoznunk egy lista elemeivel. Ez viszont létrehozta a futásidejű hibák egy bizonyos osztályát:
List aList = new ArrayList (); aList.add (új egész szám (1)); aList.add ("a_string"); for (int i = 0; i <aList.size (); i ++) {Egész x = (Egész) aList.get (i); }
Ennek a kódnak két kérdése van, amelyekkel foglalkozni szeretnénk:
- Szükségünk van egy kifejezett szereplőgárdára, hogy kivonjuk az értékeket egy listát - a típus a bal oldali változó típusától függ - Egész szám ebben az esetben
- Futásidejű hibát fogunk kapni a második iteráción, amikor megpróbáljuk átküldeni húr egy Egész szám
A generikusok töltik be számunkra a szerepet:
IList = new ArrayList () lista; iList.add (1); iList.add ("a_húr"); // időhiba összeállítása (int i = 0; i <iList.size (); i ++) {int x = iList.get (i); }
A fordító elmondja nekünk, hogy nem lehet hozzáadni húr a Lista típusú Egész szám, ami jobb, mint futás közben megtudni.
Sőt, nincs szükség kifejezett castingra, mivel a fordító ezt már tudja iList tart Egész száms. Ezenkívül a kibontás varázslata miatt nem is volt szükségünk Egész szám típusú, primitív alakja elég.
3. Helyettesítő karakterek a Generics-ben
Kérdőjelet vagy helyettesítő karaktert használnak a generikus gyógyszerek egy ismeretlen típus képviseletére. Három formája lehet:
- Korlátlan helyettesítő karakterek: Lista egy ismeretlen típusú listát képvisel
- Felső korlátozott helyettesítő karakterek: Lista a Szám vagy annak altípusai, például Egész szám és Kettős
- Alsó határolt helyettesítő karakterek: Lista a Egész szám vagy annak szupertípusai Szám és Tárgy
Most, azóta Tárgy a Java minden típusának benne rejlő szupertípus, kísértésnek lennénk gondolni, hogy ez ismeretlen típust is képviselhet. Más szavakkal, Lista és Lista ugyanazt a célt szolgálhatná. De nem teszik.
Vizsgáljuk meg ezt a két módszert:
public static void printListObject (List list) {for (Object element: list) {System.out.print (elem + ""); }} public static void printListWildCard (List list) {for (Object element: list) {System.out.print (elem + ""); }}
Adott egy lista Egész száms, mondd:
List li = Tömbök.asList (1, 2, 3);
printListObject (li) nem fordítja le, és ezt a hibát kapjuk:
A printListObject (List) metódus nem használható az argumentumokhoz (List)
Mivel printListWildCard (li) összeállítja és kimeneti 1 2 3 a konzolhoz.
4. és - a hasonlóságok
A fenti példában, ha megváltoztatjuk a metódus aláírását a printListWildCard nak nek:
public static void printListWildCard (Lista lista)
Ugyanúgy működne, mint printListWildCard (Lista lista) tette. Ez annak a ténynek köszönhető, hogy Tárgy az összes Java objektum szupertípusa, és alapvetően minden kiterjed Tárgy. Szóval, a Lista nak,-nek Egész száms feldolgozásra kerül.
Röviden, ez azt jelenti ? és ? kiterjeszti az Objektumot szinonimák ebben a példában.
Bár a legtöbb esetben ez igaz is lenne, de van néhány különbség is. Nézzük meg őket a következő részben.
5. és - a különbség
Az újra megismételhető típusok azok, amelyek típusa nem törlődik a fordítás idején. Más szavakkal, egy nem újrarealizálható típus futásidejű ábrázolásának kevesebb információja lesz, mint a fordítási idejű megfelelőjénél, mert némelyik törlődik.
Általános szabály, hogy a paraméterezett típusok nem igazolhatók újra. Ez azt jelenti, hogy Lista és Térkép nem igazolhatók. A fordító törli a típusukat, és a-ként kezeli őket Lista és Térkép illetőleg.
Ez alól a szabály alól csak a korlátlan helyettesítő karaktertípusok tartoznak. Ez azt jelenti, hogy Lista és Térkép újrafelhasználhatók.
Másrészről, Lista nem igazolható. Bár finom, ez figyelemre méltó különbség.
A nem újratermelhető típusok nem használhatók bizonyos helyzetekben, például egy Például az operátor vagy egy tömb elemeként.
Tehát, ha azt írjuk:
List someList = new ArrayList (); boolean instanceTest = someList példány a Listáról
Ez a kód összeállítja és instanceTest van igaz.
De ha a Például az üzemeltető be Lista:
Soroljon fel egy másik listát = új tömblista (); boolean instanceTest = anotherList instanceof List;
akkor a 2. sor nem áll össze.
Hasonlóképpen, az alábbi részletben az 1. sor fordít, de a 2. sor nem:
Lista [] arrayOfList = új Lista [1]; Lista [] arrayOfAnotherList = új Lista [1]
6. Következtetés
Ebben a rövid bemutatóban a hasonlóságokat és különbségeket láttuk és .
Noha többnyire hasonlóak, vannak finom különbségek a kettő között abban a tekintetben, hogy újjá lehet-e állítani vagy sem.