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 A
memiliki metode empty(Box<? extends Number> b)
,. Kami mengkompilasi A.java
dan 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 B
yang memanggil metode empty
dengan argumen non-parameter (tipe mentah): empty(new Box())
. Jika kita kompilasi B.java
dengan A.class
di 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?