Saya membaca tentang penghapusan tipe Java di situs web Oracle .
Kapan penghapusan tipe terjadi? Pada waktu kompilasi atau runtime? Kapan kelas dimuat? Kapan kelas dipakai?
Banyak situs (termasuk tutorial resmi yang disebutkan di atas) mengatakan penghapusan tipe terjadi pada waktu kompilasi. Jika informasi jenis dihapus sepenuhnya pada waktu kompilasi, bagaimana JDK memeriksa kompatibilitas jenis ketika metode menggunakan obat-obatan dipanggil tanpa informasi jenis atau informasi jenis yang salah?
Pertimbangkan contoh berikut: Katakanlah kelas Amemiliki metode empty(Box<? extends Number> b),. Kami mengkompilasi A.javadan mendapatkan file kelas A.class.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Sekarang kita buat kelas lain Byang memanggil metode emptydengan argumen non-parameter (tipe mentah): empty(new Box()). Jika kita kompilasi B.javadengan A.classdi classpath, javac cukup pintar untuk membangkitkan peringatan. Jadi A.class ada beberapa jenis informasi yang tersimpan di dalamnya.
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());
}
}
Dugaan saya adalah bahwa penghapusan tipe terjadi ketika kelas dimuat, tetapi itu hanya dugaan. Jadi kapan itu terjadi?