Đối với biến bạn đã cho:
List<? extends Reader> weirdList;
Tất cả các bài tập sau đây là hợp lệ:
weirdList = new ArrayList<Reader>();
weirdList = new ArrayList<FileReader>();
weirdList = new ArrayList<BufferedReader>();
weirdList = new ArrayList<InputStreamReader>();
Hy vọng rằng điều này giải thích lỗi biên dịch của bạn. Những gì bạn đang cố gắng có ý nghĩa nếu weirdList
giữ giá trị loại ArrayList<BufferedReader>
, nhưng không có ý nghĩa đối với giá trị loại ArrayList<FileReader>
. Vì một biến kiểu List<? extends Reader>
có thể giữ một giá trị của một trong hai loại (và nhiều hơn nữa!), Java gọi là một lỗi.
Generics trong Java rất khó để có được đầu của bạn xung quanh. Bạn có thể nghĩ loại List<? extends Reader>
là chủ yếu hữu ích cho việc gán hoặc kiểu tham số trong các phương thức để chúng có thể chấp nhận nhiều loại khác nhau. Đối với "thường xuyên sử dụng", bạn có thể tốt hơn với một "trần" chung như List<Reader>
hoặc thậm chí List<BufferedReader>
.
có thể trùng lặp với [Câu hỏi WildCard Java Generics: Danh sách extends A>] (http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a) – yshavit
(FWIW, những gì bạn muốn ở đây là 'Danh sách', không phải 'Danh sách mở rộng Reader>'.) –