Nyers típusok Java-ban

1. Bemutatkozás

Ebben a gyors bemutatóban megnézzük a nyers típusokat, melyek azok, és miért kellene kerülnünk őket.

2. Nyers típusok

A nyers típus a általános interfész vagy osztály a típus argumentuma nélkül:

Lista lista = new ArrayList (); // nyers típus

Ahelyett:

List listIntgrs = new ArrayList (); // paraméterezett típus

Lista egy paraméterezett típus az interfész Lista míg Lista egy nyers típus az interfész Lista.

A nyers típusok hasznosak lehetnek, ha nem általános örökölt kóddal kapcsolódnak.

Egyébként azonban ez csüggedt. Ez azért van, mert:

  1. Nem kifejezők
  2. Hiányzik a típusbiztonság, és
  3. A problémákat futási időben figyeljük meg, és nem fordítási időben

3. Kifejezhetetlen

A nyers típus nem dokumentálja, és elmagyarázza magát, ahogyan a paraméterezett típus teszi.

Könnyen arra következtethetünk, hogy egy paraméterezett típus Lista egy lista, amely tartalmazza Húrs. Egy nyers típusnál azonban hiányzik ez az egyértelműség, ezért megnehezíti a munkát vele és az API módszereivel.

Lássuk a módszer aláírását get (int index) ban,-ben Lista felület, hogy ezt jobban megértsük:

/ ** * Az elemet a lista megadott helyére adja vissza. * * @param index index a visszatéréshez * @visszaadja az elemet a lista megadott pontján ;

A módszer, a metódus get (int index) visszatér a Húr helyzetben index paraméterezett típusban Lista.

Nyers típusnál azonban Lista, akkor egy Tárgy. Ezért további erőfeszítéseket kell tennünk a nyers típusú elem típusának ellenőrzésére és azonosítására Lista és adjon hozzá egy megfelelő típusú öntvényt. Ez hibákat jeleníthet meg futási időben, mint a nyers típus nem típusú biztonságos.

4. Nem típusbiztonságos

A generikumok előtti viselkedést nyers típusokkal kapjuk meg. Ezért nyers típus Lista elfogadja Tárgy és bármilyen típusú adatot tartalmazhat. Ez típusbiztonsági problémákhoz vezethet, amikor a paraméterezett és a nyers típusokat keverjük össze.

Lássuk ezt egy olyan kód létrehozásával, amely példányosítja a Lista mielőtt átadná egy olyan módszernek, amely elfogadja a nyers típust Lista és hozzátesz egy Egész szám hozzá:

public void methodA () {List parameterizedList = new ArrayList (); parameterizedList.add ("Hello Folks"); módszerB (parametrizáltList); } public void methodB (List rawList) {// nyers típus! rawList.add (1); }

A kód összeáll (figyelmeztetéssel), és a Egész szám hozzáadódik a nyers típushoz Lista amikor kivégzik. A Lista ezt érvként fogadták el most tartalmaz egy Húr és egy Egész szám.

A fordító figyelmeztetést nyomtat ki a nyers típusok használata miatt:

Megjegyzés: A RawTypeDemo.java nem ellenőrzött vagy nem biztonságos műveleteket használ. Megjegyzés: Újrafordítás a -Xlint használatával: a részletekért nincs bejelölve.

5. Futásidejű problémák

A nyers típus típusbiztonságának hiánya ok-okozati hatással jár, amely futás közbeni kivételekhez vezethet.

Módosítsuk az előző példát úgy módszerA megkapja az elemet az indexünk 1. pozíciójában Lista miután felhívta módszerB:

public void methodA () {List parameterizedList = new ArrayList (); parameterizedList.add ("Hello Folks"); metódus B (paraméterezett lista); String s = paraméterezettList.get (1); } public void módszerB (List rawList) {rawList.add (1); }

A kód lefordul (ugyanazzal a figyelmeztetéssel), és dob egy ClassCastException amikor kivégzik. Ez módszerként történik get (int index) visszatér egy Egész szám, amely nem rendelhető hozzá egy típusú változóhoz Húr:

Kivétel a "main" szálban java.lang.ClassCastException: java.lang.Integer nem adható át a java.lang.String fájlba.

6. Következtetés

A nyers típusokkal nehéz dolgozni, és hibákat jeleníthetnek meg kódunkban.

Használatuk katasztrofális következményekkel járhat, és sajnos a legtöbb ilyen katasztrófa futási időben történik.

Nézze meg az oktatóanyag összes részletét a GitHubon.