Borrado de tipo genérico de Java: ¿cuándo y qué sucede?
Leí sobre el borrado de tipos de Javaen 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: decir claseA
tiene un métodoempty(Box<? extends Number> b)
. Nosotros compilamosA.java
y obtener el archivo de claseA.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Ahora creamos otra claseB
que invoca el métodoempty
con un argumento no parametrizado (tipo sin formato):empty(new Box())
. Si compilamosB.java
conA.class
en el classpath, javac es lo suficientemente inteligente como para generar una advertencia. EntoncesA.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?