Для переменной вы дали:
List<? extends Reader> weirdList;
Все следующие задания действительны:
weirdList = new ArrayList<Reader>();
weirdList = new ArrayList<FileReader>();
weirdList = new ArrayList<BufferedReader>();
weirdList = new ArrayList<InputStreamReader>();
Надеемся, что это объясняет свою ошибку компиляции. То, что вы пытаетесь, имеет смысл, если weirdList
имеет значение типа ArrayList<BufferedReader>
, но не имеет смысла для значения типа ArrayList<FileReader>
. Поскольку переменная типа List<? extends Reader>
может содержать значение любого типа (и более!), Java вызывает ошибку.
Дженерики на Java трудно найти. Вы можете придумать тип List<? extends Reader>
как наиболее полезный для назначения или типов параметров в методах, чтобы они могли принимать самые разные типы. Для «регулярного использования» вам, вероятно, будет лучше «голый» общий, например List<Reader>
или даже List<BufferedReader>
.
возможно дубликат [Java дженериков WildCard Вопрос: Список extends A>] (http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a) – yshavit
(FWIW, что вы хотите здесь is 'List', а не 'List extends Reader>'.) –