Írja be a Törlés parancsot Java-ban

1. Áttekintés

Ebben a rövid cikkben a Java törzseként ismert fontos mechanizmus alapjait tárgyaljuk.

2. Mi az a típusú törlés?

A típus törlése a típuskorlátok érvényesítésének folyamataként magyarázható csak fordításkor és az elemtípus információk futás közbeni elvetésével.

Például:

public static boolean tartalmazzaElement (E [] elemek, E elem) {for (E e: elemek) {if (e.egyenlőség (elem)) {return true; }} return false; }

A fordító a nem kötött típust helyettesíti E tényleges típusával Tárgy:

public static boolean tartalmazzaElement (Object [] elemek, Object element) {for (Object e: elements) {if (e.equals (element)) {return true; }} return false; }

Ezért a fordító biztosítja kódunk típusbiztonságát és megakadályozza a futásidejű hibákat.

3. A típusú törlés típusai

A típus törlése történhet osztály (vagy változó) és módszer szinten.

3.1. Osztálytípus törlés

Osztályszinten a fordító elveti a típusparamétereket az osztályon, és helyettesíti azokat az első kötésével, ill Tárgy ha a type paraméter nincs kötve.

Végezzük el a Kazal tömb használatával:

public class Verem {private E [] stackContent; public Stack (int kapacitás) {this.stackContent = (E []) új Object [kapacitás]; } public void push (E adatok) {// ..} public E pop () {// ..}}

Fordításkor a fordító kicseréli a kötetlen típusú paramétert E val vel Tárgy:

public class Stack {private Object [] stackContent; public Stack (int kapacitás) {this.stackContent = (Object []) új Object [kapacitás]; } public void push (Object data) {// ..} public Object pop () {// ..}}

Abban az esetben, ha a type paraméter E kötött:

nyilvános osztály BoundStack {privát E [] stackContent; public BoundStack (int kapacitás) {this.stackContent = (E []) új objektum [kapacitás]; } public void push (E adatok) {// ..} public E pop () {// ..}}

A fordító lecseréli a kötött típusú paramétert E az első bekötött osztállyal, Hasonló ebben az esetben:

public class BoundStack {private Comparable [] stackContent; public BoundStack (int kapacitás) {this.stackContent = (Összehasonlítható []) új objektum [kapacitás]; } public void push (Összehasonlítható adatok) {// ..} public Comparable pop () {// ..}}

3.2. Módszer típusa Törlés

Metódszintű típusú törlés esetén a módszer típusparamétere nem kerül tárolásra, hanem átalakításra kerül szülőtípusává Tárgy ha nincs kötve, vagy az első kötött osztály, amikor kötve van.

Vegyünk egy módszert az adott tömb tartalmának megjelenítésére:

public static void printArray (E [] tömb) {for (E elem: tömb) {System.out.printf ("% s", elem); }}

Fordításkor a fordító lecseréli a type paramétert E val vel Tárgy:

public static void printArray (Object [] tömb) {for (Object element: tömb) {System.out.printf ("% s", elem); }}

A kötött metódus típusú paraméterhez:

nyilvános statikus  void printArray (E [] tömb) {for (E elem: tömb) {System.out.printf ("% s", elem); }}

Megkapjuk a type paramétert E törölték és helyettesítették Hasonló:

public static void printArray (Összehasonlítható [] tömb) {for (Összehasonlítható elem: tömb) {System.out.printf ("% s", elem); }}

4. Perem esetek

A fordító valamikor a törlési folyamat során létrehoz egy szintetikus módszert a hasonló módszerek megkülönböztetésére. Ezek olyan módszer-aláírásokból származhatnak, amelyek kiterjesztik ugyanazt az első kötött osztályt.

Hozzunk létre egy új osztályt, amely kiterjeszti a korábbi megvalósításunkat Kazal. Felhívjuk figyelmét, hogy ez a Kazal osztályban hoztunk létre 3.1. szakasz, és nem java.util.Stack.

public class IntegerStack kiterjeszti Stack {public IntegerStack (int kapacitás) {super (kapacitás); } public void push (Egész érték) {super.push (érték); }}

Most nézzük meg a következő kódot:

IntegerStack integerStack = új IntegerStack (5); Verem verem = integerStack; stack.push ("Hello"); Egész adatok = integerStack.pop ();

A típus törlése után:

IntegerStack integerStack = új IntegerStack (5); Verem verem = (IntegerStack) integerStack; stack.push ("Hello"); Egész adatok = (String) integerStack.pop ();

Figyeljük meg, hogyan tudjuk lökni a String a IntegerStack - mivel IntegerStack örökölt nyomás (objektum) a szülő osztályból Kazal. Ez természetesen helytelen - mivel egész számnak kellene lennie azóta integerStack egy Kazal típus.

Tehát nem meglepő módon egy kísérlet arra pop a Húr és hozzárendelni egy Egész szám okozza a ClassCastException során beillesztett gipszből nyom a fordító által.

4.1. Híd módszerek

A fenti éles eset megoldásához a fordító néha létrehoz egy híd metódust. Ez egy szintetikus módszer, amelyet a Java fordító hozott létre, miközben olyan osztályt vagy interfészt állított össze, amely kiterjeszti a paraméterezett osztályt vagy megvalósít egy paraméterezett felületet, ahol a metódus aláírása kissé eltérhet vagy félreérthető lehet.

A fenti példánkban a Java fordító megőrzi az általános típusok polimorfizmusát a törlés után azáltal, hogy nem biztosítja a módszer aláírásának eltérését IntegerStack’S push (egész szám) módszer és Kazal’S nyomás (objektum) módszer.

Ezért a fordító itt létrehoz egy híd módszert:

public class IntegerStack kiterjeszti a Stack {// a fordító által generált Bridge metódust public void push (Object value) {push ((Integer) value); } public void push (Egész szám) {super.push (érték); }}

Következésképpen, Kazal osztályé nyom módszer törlés után delegálja az eredetit nyom a metódusa IntegerStack osztály.

5. Következtetés

Ebben az oktatóanyagban megvitattuk a típus törlésének fogalmát példákkal a típusparaméter-változókban és a módszerekben.

Ezekről a fogalmakról bővebben olvashat:

  • Java nyelv specifikáció: Típus törlés
  • A Java Generics alapjai

Mint mindig, a cikket kísérő forráskód elérhető a GitHubon.