Я читал об удалении типов 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
в пути к классам, 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());
}
}
Я предполагаю, что стирание типов происходит при загрузке класса, но это всего лишь предположение. Так когда же это случится?