Về cơ bản List<? extends String>
là một danh sách có kiểu không rõ, tất cả những gì được biết đến là loại hình này kéo dài chuỗi. Nó không quan trọng là biến chứa một thể hiện của List<String>
.
Bây giờ String là cuối cùng, vì vậy không có lớp con ... vì vậy hãy cân nhắc:
List<? extends A> list = new ArrayList<A>();
nơi A
là một số lớp với một lớp con B
. Khi được sử dụng, một biến loại List<? extends A>
có thể là một phiên bản của List<B>
. Chúng tôi không thể thêm A
vào nó vì có khả năng là A
không phải là B
.
Nhưng bạn biết điều đó sẽ đúng? Vâng, trình biên dịch không, cũng không dự đoán các kết nối logic giữa loại không xác định và những gì bạn đã khởi tạo, bởi vì nói chung bạn có thể thay đổi biến đó khi chạy.
Một ví dụ tương tự tồn tại trong hướng dẫn một cách lạc quan tên More Fun with Wildcards, nơi một phương pháp chấp nhận (Set<T>, T)
và một cuộc gọi bất hợp pháp được sử dụng preposed (Set<?>, String)
dù biến Set<?>
chứa một thể hiện của Set<String>
. Vấn đề là như nhau ở đây, mặc dù bổ sung extends
.
Nó không thực sự có ý nghĩa, vì 'Chuỗi' là một ** ** cuối cùng lớp! Không có lớp nào có thể mở rộng 'Chuỗi'. Vì vậy, điều duy nhất bạn nên làm là xác định nó là 'Danh sách '. –
bobbel
nhưng làm thế nào nó lấy tham chiếu của ArrayList có String là đối tượng của nó? –
Vì 'Danh sách' thỏa mãn 'Danh sách mở rộng chuỗi> '. Sự khác biệt là * Chuỗi là một String * nhưng * Chuỗi có thể không phải là một? đó là một String *. –
Linus