xem xét mã:Một Generics nhầm lẫn: lừa dối các trình biên dịch
public class GenericsConfusion {
public static <T> Class<T> get(Class<T> clazz) {
Map<Class, Class> map = new HashMap<Class, Class>();
map.put(Integer.class, String.class);
return map.get(clazz);
}
public static void main(String[] args) {
Class<Integer> clazz = get(Integer.class);
System.out.println(clazz);
}
}
Nó biên dịch và chạy một cách hoàn hảo. Ý tưởng là để trở về trong phương thức get lớp có cùng tham số kiểu như lớp đầu vào. Nhưng nó bị hỏng do sự hiện diện của bản đồ. Có, tôi biết rằng trong thời gian chạy, thông tin tham số loại sẽ bị xóa, do đó, không có thông số loại, mã này hoàn toàn hợp lệ. Ngoài ra tôi biết tôi có thể sửa chữa nó bằng cách xác định Map<Class<T>, Class<T>>
Nhưng thực tế là trong chữ ký phương pháp tôi có các thông số kiểu, và họ không giúp tôi trong thời gian biên dịch.
Đây có phải là lạm dụng một số khái niệm không?
Hoặc đó là một bất lợi của Generics Java?
Hoặc nó hoàn toàn ổn và tôi hiểu sai ý tưởng về các thông số loại?
Đó là dấu hiệu của sự yếu kém trong hệ thống kiểu Java, xuất hiện khi các tham số kiểu được thêm vào ngôn ngữ, nhưng không cấm các kiểu thô cho khả năng tương thích ngược. – Ingo
javac * thực hiện * cảnh báo các hoạt động không được kiểm tra hoặc không an toàn trong mã này. –
Vâng, tôi sẽ gọi điều này * bỏ qua *, không * lừa dối *, trình biên dịch. Trình biên dịch biết những gì đang xảy ra. –