Eu li sobre apagamento de tipo do Java no site da Oracle .
Quando ocorre o apagamento do tipo?Em tempo de compilação ou tempo de execução? Quando a turma é carregada? Quando a aula é instanciada?
Muitos sites (incluindo o tutorial oficial mencionado acima) dizem que o apagamento do tipo ocorre no momento da compilação. Se as informações de tipo forem completamente removidas no momento da compilação, como o JDK verifica a compatibilidade de tipos quando um método que usa genéricos é chamado sem informações de tipo ou informações de tipo incorretas?
Considere o seguinte exemplo: Say class A
possui um método empty(Box<? extends Number> b)
,. Nós compilamos A.java
e obtemos o arquivo de classe A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Agora vamos criar uma outra classe B
que chama o método empty
com um argumento não-parametrizado (tipo raw): empty(new Box())
. Se compilar B.java
com A.class
no classpath, javac é inteligente o suficiente para levantar um aviso. Então, A.class
tem algumas informações de tipo armazenadas nele.
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());
}
}
Meu palpite seria que o apagamento de tipo ocorre quando a classe é carregada, mas é apenas um palpite. Então, quando isso acontece?