Eliminação do tipo genérico Java: quando e o que acontece?
Eu li sobre o apagamento de tipo do Javano 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 é invocado sem informações de tipo ou informações de tipo incorretas?
Considere o seguinte exemplo: Say classA
tem um métodoempty(Box<? extends Number> b)
. Nós compilamosA.java
e obtenha o arquivo de classeA.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Agora criamos outra classeB
que chama o métodoempty
com um argumento não parametrizado (tipo bruto):empty(new Box())
. Se compilarmosB.java
comA.class
no caminho de classe, o javac é inteligente o suficiente para emitir um aviso. assimA.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 do tipo ocorre quando a classe é carregada, mas é apenas um palpite. Então, quando isso acontece?