Tôi đọc về loại tẩy của Java trên trang web của Oracle .
Khi nào loại tẩy xảy ra? Tại thời gian biên dịch hoặc thời gian chạy? Khi lớp được tải? Khi lớp được khởi tạo?
Rất nhiều trang web (bao gồm cả hướng dẫn chính thức được đề cập ở trên) cho biết loại xóa xảy ra tại thời điểm biên dịch. Nếu thông tin loại được loại bỏ hoàn toàn tại thời điểm biên dịch, làm thế nào để kiểm tra tính tương thích của loại JDK khi một phương thức sử dụng tổng quát được gọi mà không có thông tin loại hoặc thông tin loại sai?
Xem xét ví dụ sau: Say class A
có một phương thức , empty(Box<? extends Number> b)
. Chúng tôi biên dịch A.java
và lấy tệp lớp A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Bây giờ chúng ta tạo một lớp khác B
gọi phương thức empty
với một đối số không tham số (kiểu thô) : empty(new Box())
. Nếu chúng ta biên dịch B.java
với A.class
trong classpath, javac là đủ thông minh để nâng cao một cảnh báo. Vì vậy, A.class
có một số loại thông tin được lưu trữ trong đó.
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());
}
}
Tôi đoán là kiểu xóa đó xảy ra khi lớp được tải, nhưng nó chỉ là phỏng đoán. Vậy khi nào nó xảy ra?