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