Giả sử tôi có hai lớp A
và B
mở rộng A
. Với phương pháp sau đây tôi có thể in một Collection
của A
hoặc một cái gì đó kéo dài A
:<? mở rộng ...> tính độc quyền của các tham số phương thức?
private static void print(Collection<? extends A> collection) {
for (A element : collection) {
System.out.println(element);
}
}
Thật tuyệt vời, tôi có thể làm điều gì đó như:
public static void main(String[] args) {
List<A> l1 = new ArrayList<>();
l1.add(new A());
l1.add(new B());
print(l1);
List<B> l2 = new ArrayList<>();
l2.add(new B());
l2.add(new B());
print(l2);
}
Bây giờ câu hỏi của tôi là tại sao trong phương pháp của tôi main
(hoặc ở một nơi khác) Tôi có thể viết điều này
List<? extends A> l3 = new ArrayList<>();
nhưng không phải điều này
l3.add(new A());
l3.add(new B());
Tôi hiểu tại sao tôi không thể thêm phiên bản A
hoặc B
vào l3
. Nhưng tại sao tuyên bố đầu tiên dường như vô dụng được cho phép?
EDIT
tôi hỏi với các từ khác vì tôi nghĩ rằng câu hỏi của tôi là hiểu lầm.
Tôi có thể làm gì với danh sách trống List<? extends A> l3 = new ArrayList<>();
? Tôi biết không thể thêm bất cứ điều gì vì loại danh sách không xác định.
Nó thậm chí có thể được 'Danh sách', nơi 'C' là cl khác ass mở rộng 'A'. Vì vậy, 'add (new B())' không an toàn. –
Henry
Vì vậy, nó không có ý nghĩa gì để viết 'Danh sách extends A> l3 = new ArrayList <>();' vì nó không thể sử dụng sau này? – cheb1k4
Có thể sử dụng được. Bạn không thể thêm vào nó. – VGR