Стирание типа дженериков Java: когда и что происходит?

Я читал о стирании типов Javaна сайте Oracle.

Когда происходит стирание типа? Во время компиляции или во время выполнения? Когда класс загружается? Когда будет создан экземпляр класса?

Многие сайты (включая упомянутое выше официальное руководство) говорят, что стирание типов происходит во время компиляции. Если информация о типе полностью удаляется во время компиляции, как JDK проверяет совместимость типов, когда метод, использующий обобщения, вызывается без информации о типе или неправильной информации о типе?

Рассмотрим следующий пример: скажите классA есть метод,empty(Box<? extends Number> b), Мы компилируемA.java и получить файл классаA.class.

public class A {
    public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}

Теперь мы создаем еще один классB который вызывает методempty с параметризованным аргументом (необработанный тип):empty(new Box()), Если мы скомпилируемB.java сA.class в classpath javac достаточно умен, чтобы поднять предупреждение. ТакA.class имеет некоторая информация о типе хранится в нем.

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());
    }
}

Я предполагаю, что стирание типов происходит при загрузке класса, но это всего лишь предположение. Так когда же это случится?

Ответы на вопрос(7)

Ваш ответ на вопрос