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 Ahat eine Methode empty(Box<? extends Number> b). Wir kompilieren A.javaund 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, Bdie die Methode emptymit einem nicht parametrisierten Argument (Rohtyp) aufruft : empty(new Box()). Wenn wir im Klassenpfad B.javamit 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?