Я прочитал о стирании типа Java на веб-сайте Oracle.
Когда происходит стирание типа? Во время компиляции или времени выполнения? Когда класс загружен? Когда экземпляр класса создается?
Многие сайты (включая официальный урок, упомянутый выше) говорят, что стирание стилей происходит во время компиляции. Если информация о типе полностью удалена во время компиляции, как совместимость типа проверки JDK при вызове метода с использованием дженериков без информации типа или неверной информации о типе?
Рассмотрим следующий пример: Say class 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
с непараметрированным аргументом (raw type): 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());
}
}
Мое предположение заключалось бы в том, что стирание типа происходит, когда класс загружается, но это всего лишь предположение. Итак, когда это происходит?