Í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.