Tôi đã bắt gặp một cái gì đó tôi thấy lạ trong Java và không thể tìm thấy nhiều thông tin về nó. Xét đoạn mã sau:Generics and Abstract Methods
public class TestClass {
private static abstract class AbstractClass {
abstract List<? extends Object> getList();
abstract Map<Long, List<? extends Object>> getMap();
}
private static final class ConcreteClass extends AbstractClass {
@Override
List<String> getList() {
return null;
}
@Override
Map<Long, List<String>> getMap() {
return null;
}
}
}
Trình biên dịch cho thấy một lỗi trên getMap()
phương pháp:
getMap() in ConcreteClass cannot override getMap() in AbstractClass
return type Map<Long, List<String>> is not compatible with Map<Long, List<? extends Object>>
Nhưng những lỗi tương tự là không có mặt đối với phương pháp getList()
, nhưng tôi mong chờ hoặc cả hai để làm việc hoặc cả hai đều thất bại. Trong cả hai trường hợp, phương pháp ghi đè là delcaring List<String>
thay cho List<? extends Object>
. Ai đó có thể giải thích điều này?
Câu trả lời hay, cảm ơn! (Tôi sẽ chấp nhận sau khi hết thời hạn) – lucasvw
điểm tốt, tôi muốn thêm '? mở rộng Object' có thể được thay thế bằng '?' mà không có bất kỳ hiệu ứng nào – Andrew
@Andrew: chắc chắn, nhưng nguyên tắc tương tự áp dụng cho bất kỳ giới hạn dưới nào trên ký tự đại diện, không chỉ là 'Object'. –