Xét đoạn mã sau:Tại sao phương thức gọi với trả về chung trên một lớp chung được coi là không an toàn bởi javac?
public class Main {
public static class NormalClass {
public Class<Integer> method() {
return Integer.class;
}
}
public static class GenericClass<T> {
public Class<Integer> method() {
return Integer.class;
}
}
public static void main(String... args) {
NormalClass safeInstance = new NormalClass();
Class<Integer> safeValue = safeInstance.method();
GenericClass unsafeInstance = new GenericClass();
Class<Integer> unsafeValue = unsafeInstance.method();
}
}
Nếu tôi biên dịch nó với:
$ javac -Xlint:unchecked Main.java
Nó trả về:
Main.java:16: warning: [unchecked] unchecked conversion
Class<Integer> unsafeValue = unsafeInstance.method();
^
required: Class<Integer>
found: Class
1 warning
Xin lưu ý rằng chỉ có phương pháp chung được coi là không an toàn, ngay cả khi không có loại chung nào được tham chiếu trên kiểu trả về.
Đây có phải là lỗi javac
không? Hoặc có một lý do sâu sắc hơn cho điều này tôi không tính đến?
Tôi không biết lý do, nhưng nó chỉ xảy ra nếu lớp chung mà phương thức được khai báo là kiểu thô. – Bubletan
Tôi nhận được lỗi trên GenericClass unsafeInstance = new GenericClass(); thay thế. Điều này là do bạn đã khởi tạo một kiểu generic mà không có đối số kiểu. –
Bởi vì khi bạn chọn sử dụng các loại thô, về cơ bản bạn đang nói với trình biên dịch mà bạn muốn ở chế độ cũ không an toàn. Không sử dụng các loại thô. Đọc http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it –