Java génériques type d'effacement: quand et ce qui se passe?

J'ai lu sur Java de type de l'effacement sur le site web d'Oracle.

Quand le type d'effacement de se produire? Au moment de la compilation ou de l'exécution? Lorsque la classe est chargée? Lorsque la classe est instanciée?

Beaucoup de sites (y compris le tutoriel officiel mentionné ci-dessus) dire le type d'effacement se produit au moment de la compilation. Si le type d'informations est totalement supprimé au moment de la compilation, comment le JDK vérifier la compatibilité du type quand une méthode utilisant des génériques est invoquée sans informations de type ou de type incorrect de l'information?

Considérons l'exemple suivant: supposons que la classe A a une méthode, empty(Box<? extends Number> b). Nous compilons A.java et d'obtenir le fichier de classe A.class.

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

Maintenant nous allons créer une autre classe B qui invoque la méthode empty avec un non paramétrée argument (raw): empty(new Box()). Si nous compilons B.java avec A.class dans le classpath, javac est assez intelligent pour élever un avertissement. Donc A.class a un certain type d'informations qui y sont stockées.

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());
    }
}

J'imagine que le type d'effacement se produit lorsque la classe est chargée, mais c'est juste une supposition. Alors quand est-ce arrivé?

Plus version "générique" de cette question: stackoverflow.com/questions/313584/...

OriginalL'auteur | 2008-12-04