Ich habe auf der Oracle-Website über Javas Typlöschung gelesen .
Wann erfolgt die Typlöschung? Zur Kompilierungszeit oder zur Laufzeit? Wann wird die Klasse geladen? Wann wird die Klasse instanziiert?
Viele Websites (einschließlich des oben erwähnten offiziellen Tutorials) geben an, dass die Typlöschung zur Kompilierungszeit erfolgt. Wenn die Typinformationen beim Kompilieren vollständig entfernt werden, wie überprüft das JDK die Typkompatibilität, wenn eine Methode mit Generika ohne Typinformationen oder falsche Typinformationen aufgerufen wird?
Betrachten Sie das folgende Beispiel: Angenommen, die Klasse A
hat eine Methode empty(Box<? extends Number> b)
. Wir kompilieren A.java
und erhalten die Klassendatei A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Jetzt erstellen wir eine weitere Klasse, B
die die Methode empty
mit einem nicht parametrisierten Argument (Rohtyp) aufruft : empty(new Box())
. Wenn wir im Klassenpfad B.java
mit kompilieren A.class
, ist javac klug genug, um eine Warnung auszulösen. So A.class
hat irgendeine Art Informationen darin gespeichert.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: Box
// java: unchecked conversion
// required: Box<? extends java.lang.Number>
// found: Box
A.empty(new Box());
}
}
Meine Vermutung wäre, dass das Löschen des Typs auftritt, wenn die Klasse geladen wird, aber es ist nur eine Vermutung. Wann passiert es?