Ho letto della cancellazione del tipo di Java sul sito Web di Oracle .
Quando si verifica la cancellazione del tipo?In fase di compilazione o runtime? Quando la classe è caricata? Quando la classe viene istanziata?
Molti siti (incluso il tutorial ufficiale sopra menzionato) affermano che la cancellazione del tipo avviene al momento della compilazione. Se le informazioni sul tipo vengono completamente rimosse al momento della compilazione, in che modo JDK verifica la compatibilità del tipo quando viene richiamato un metodo che utilizza generics senza informazioni di tipo o informazioni di tipo errate?
Si consideri il seguente esempio: class Say A
ha un metodo, empty(Box<? extends Number> b)
. Compiliamo A.java
e otteniamo il file di classe A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Ora creiamo un'altra classe B
, che richiama il metodo empty
con un argomento senza parametri (tipo raw): empty(new Box())
. Se si compila B.java
con A.class
nel classpath, javac è abbastanza intelligente per sollevare un avvertimento. Quindi A.class
contiene alcune informazioni sul tipo.
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());
}
}
La mia ipotesi sarebbe che la cancellazione del tipo si verifichi quando la classe viene caricata, ma è solo un'ipotesi. Quindi quando succede?