Java-Generics schreiben Löschen: Wann und was passiert?

Lese ich über Java type erasure auf der Oracle-website.

Wenn nicht Typ erasure auftreten? Bei der Kompilierung oder zur Laufzeit? Wenn die Klasse geladen wird? Wenn die Klasse instanziiert wird?

Viele Websites (einschließlich der offiziellen tutorial oben erwähnt) sagen, geben Sie die Löschung erfolgt zur compile-Zeit. Wenn die Typ-Informationen vollständig entfernt wird zur compile-Zeit, wie funktioniert das JDK Typ Kontrollkästchen Kompatibilität beim eine Methode die Verwendung von Generika ist aufgerufen, mit Nein geben Sie Informationen oder falsche Informationen eingeben?

Betrachten Sie das folgende Beispiel: Sagen Klasse A hat eine Methode empty(Box<? extends Number> b). Wir kompilieren A.java und Holen Sie sich die class-Datei A.class.

public class A {
    public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}

Nun erstellen wir eine weitere Klasse B die ruft die Methode empty mit einer nicht-parametrisierten argument (raw-Typ): empty(new Box()). Wenn wir kompilieren B.java mit A.class im classpath javac ist smart genug, um zu erheben eine Warnung. So A.class hat irgendeine Art Informationen in ihm gespeichert sind.

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 der Typ Löschung tritt auf, wenn die Klasse geladen wird, aber es ist nur eine Vermutung. Also, Wann soll es passieren?

InformationsquelleAutor der Frage | 2008-12-04

Schreibe einen Kommentar