Für die Variable, die Sie gab:
List<? extends Reader> weirdList;
Alle folgenden Zuordnungen sind gültig:
weirdList = new ArrayList<Reader>();
weirdList = new ArrayList<FileReader>();
weirdList = new ArrayList<BufferedReader>();
weirdList = new ArrayList<InputStreamReader>();
Hoffentlich erklärt Ihre Compiler-Fehler. Was Sie versuchen, macht Sinn, wenn weirdList
einen Wert vom Typ ArrayList<BufferedReader>
enthält, aber für einen Wert vom Typ ArrayList<FileReader>
keinen Sinn ergibt. Da eine Variable vom Typ List<? extends Reader>
einen Wert beider Typen (und mehr!) Enthalten kann, ruft Java diesen Fehler auf.
Generika in Java sind schwer zu verstehen. Sie können sich den Typ List<? extends Reader>
so vorstellen, dass er für Zuweisungs- oder Parametertypen in Methoden am nützlichsten ist, damit sie eine Vielzahl von Typen akzeptieren können. Für "normalen Gebrauch" sind Sie vermutlich besser mit einem "blanken" generischen wie List<Reader>
oder sogar List<BufferedReader>
.
möglich duplicate von [Java Generics WildCard Frage: Liste extends A>] (http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a) – yshavit
(FWIW, was Sie hier wollen ist 'List', nicht 'List extends Reader>'.) –