Ich studiere Generika in dieser Zeit und heute habe ich dieses Geheimnis für mich gefunden.Wie wirkt sich die Java-Löschung auf die generischen Arrays aus?
Lassen Sie uns die folgende Dummy-Klasse betrachten:
public class Main{
public static void main(String[] args) {
Container<Integer> c = new Container<Integer>();
c.getArray(); //No Exception
//c.getArray().getClass(); //Exception
//int a = c.getArray().length; //Exception
}
}
class Container<T> {
T[] array;
@SuppressWarnings("unchecked")
Container() {
array = (T[])new Object[1];
}
void put(T item) {
array[0] = item;
}
T get() { return array[0]; }
T[] getArray() { return array; }
}
Aufgrund der Löschung, zur Laufzeit, die T [] Rückgabetyp der getArray() -Methode wird in ein Objekt einge [], was völlig in Ordnung ist mich.
Wenn wir auf diese Methode zugreifen, wie sie ist (c.getArray()), werden keine Ausnahmen ausgelöst, aber wenn wir versuchen, einige Methoden für das zurückgegebene Array aufzurufen, zum Beispiel c.Array(). GetClass(), oder ., wenn wir versuchen, auf ein Feld zuzugreifen, zum Beispiel c.getArray() Länge, dann wird die folgende Ausnahme ausgelöst:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang. Objekt; kann nicht in [Ljava.lang.Integer;
Warum wird diese Ausnahme ausgelöst? Warum wird es nicht auch für den einfachen Aufruf c.getArray() geworfen? Warum versucht es, zu Integer [] zu konvertieren, wenn wir getClass() aufrufen oder auf die Länge zugreifen? Sind getClass() und Länge nicht auch für Objekt [] verfügbar?
Vielen Dank im Voraus für Ihre vielen (hoffe ich) und erklärenden (ich hoffe dies auch) Antworten.
Um den Wert von 'c.getArray()' zu dereferenzieren, muss ein Verweis darauf temporär im Stack gespeichert werden. Ich kann mir vorstellen, dass JLS sagt - irgendwo, immer noch -, dass diese temporäre Variable überprüft werden muss, um zu sehen, ob es der ungelöschte Typ ist (da Sie den ungelöschten Typ dort kennen). –
In der Tat funktioniert es, wenn Sie die Dereferenzierung in einer Methode wie 'statische void foo (Container c) {c.getArray(). GetClass(); } ' –
Es gibt einen interessanten Unterschied im Bytecode, wenn Sie' 'in'