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?

questionAnswers(7)

yourAnswerToTheQuestion