Leí sobre el borrado de tipos de Java en el sitio web de Oracle .
¿Cuándo ocurre el borrado de tipo? ¿En tiempo de compilación o tiempo de ejecución? Cuando se carga la clase? ¿Cuándo se instancia la clase?
Muchos sitios (incluido el tutorial oficial mencionado anteriormente) dicen que el borrado de tipo ocurre en el momento de la compilación. Si la información de tipo se elimina por completo en el momento de la compilación, ¿cómo verifica el JDK la compatibilidad de tipo cuando se invoca un método que usa genéricos sin información de tipo o información de tipo incorrecta?
Considere el siguiente ejemplo: class Say A
tiene un método, empty(Box<? extends Number> b)
. Compilamos A.java
y obtenemos el archivo de clase A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Ahora vamos a crear otra clase B
que invoca el método empty
con un argumento que no es parametrizada (tipo cruda): empty(new Box())
. Si se compila B.java
con A.class
la ruta de clases, javac es lo suficientemente inteligente como para levantar una advertencia. Entonces A.class
tiene algún tipo de información almacenada en él.
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());
}
}
Supongo que ese tipo de borrado ocurre cuando se carga la clase, pero es solo una suposición. Entonces, ¿cuándo sucede?