J'ai lu sur l'effacement de type Java sur le site Web d'Oracle .
Quand l'effacement de type se produit-il? Au moment de la compilation ou de l'exécution? Quand la classe est chargée? Quand la classe est instanciée?
De nombreux sites (y compris le tutoriel officiel mentionné ci-dessus) disent que l'effacement de type se produit au moment de la compilation. Si les informations de type sont complètement supprimées au moment de la compilation, comment le JDK vérifie-t-il la compatibilité des types lorsqu'une méthode utilisant des génériques est invoquée sans informations de type ou avec des informations de type incorrectes?
Prenons l'exemple suivant: classe Say A
a une méthode, empty(Box<? extends Number> b)
. Nous compilons A.java
et obtenons le fichier de classe A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Maintenant , nous créons une autre classe B
qui invoque la méthode empty
avec un argument non paramétrées (type brut): empty(new Box())
. Si nous compilons B.java
avec A.class
dans le chemin de classe, javac est assez intelligent pour déclencher un avertissement. AlorsA.class
est de même pour certaines informations de type.
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());
}
}
Je suppose que l'effacement de type se produit lorsque la classe est chargée, mais ce n'est qu'une supposition. Alors, quand cela se produit-il?