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.


$config[zx-auto] not found$config[zx-overlay] not found