Hãy có hệ thống phân cấp lớp sau đây:Lỗi Generics Java?
public class MyType {
}
public class MySuperclass<T extends MyType> {
protected Map<String, String> myMap = new TreeMap<String, String>();
protected String myMethod(String s) {
return myMap.get(s);
}
}
public class MySubclass extends MySuperclass {
@Override
protected String myMethod(String s) {
return myMap.get(s); // <-- compilation error
}
}
Tại sao có một lỗi biên dịch trong phương pháp overriden của MySubclass
? Thông báo lỗi là "Loại không phù hợp: không thể chuyển đổi từ đối tượng thành chuỗi".
Điều thú vị là các dissapears lỗi biên dịch nếu tôi xác định Generics loại lớp cho MySuperclass
trong MySubclass
định nghĩa:
public class MySubclass extends MySuperclass<MyType> {
@Override
protected String myMethod(String s) {
return myMap.get(s);
}
}
ai đó có thể giải thích hành vi này? Tôi sẽ coi nó là một lỗi trình biên dịch Java.
Tôi đang sử dụng jdk1.6.0_24.
chính xác. Đó là một trong những "puzzlers" của Bloch. – Bozho
Vì vậy Generics là tất cả hoặc không có gì? Nếu bạn sử dụng một loại thô, bạn sẽ không nhận được bất kỳ generics cho loại đó, thậm chí không phải là các phần mà không phụ thuộc vào 'T' ở tất cả? – Thilo
Nhưng những gì có định nghĩa chung của 'MySuperclass ** **' chung với Generics của 'Map ** ** myMap'? Đó là hai định nghĩa generics khác nhau không có 'kết nối' giữa chúng. Tôi không hiểu. –