2013-04-02 10 views
5

Dieser Code:<? extends > Java-Syntax

List<? extends Reader> weirdList; 
weirdList.add(new BufferedReader(null)); 

hat einen Compiler-Fehler von

Die Methode hinzufügen in der Art Liste ist nicht anwendbar für die (Capture # 1-of erstreckt Reader?) Argumente (BufferedReader)

Warum? BufferedReader erweitert Reader, also warum ist das nicht ein "Match"?

+2

möglich duplicate von [Java Generics WildCard Frage: Liste ] (http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a) – yshavit

+0

(FWIW, was Sie hier wollen ist 'List ', nicht 'List '.) –

Antwort

3

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>.

6

Wenn der Compiler <? extends Reader> sieht, dann wird davon ausgegangen, dass es jeder Typ sein könnte, die bzw. erstreckt sich Reader ist. Es könnte etwas sein, das mit BufferedReader, wie StringReader nicht kompatibel ist. Wenn also der generische Typ in der Klassendefinition im Parameter einer Methode wie add auftaucht und der Typ der Instanz etwa <? extends Something> hat, muss der Compiler dies aus Gründen der Typsicherheit ablehnen. In diesem Beispiel könnte es könnteList<StringReader> sein, so dass Sie hier nicht BufferedReader hinzufügen können.

6

List<? extends Reader> weirdList kann Bezug auf einen beliebigen Typ von List halten, der jede Art von Reader speichert. So ist es möglich, dass

List<? extends Reader> weirdList1 = new ArrayList<BufferedReader>(); 
List<? extends Reader> weirdList2 = new ArrayList<FileReader>(); 

Wenn Java Ihnen erlauben würde, BufferedReader zu weirdList1 hinzufügen es auch Sie müssten hinzufügen lassen BufferedReader zu weirdList2 (Referenztyp ist das gleiche), die nicht passieren wird angenommen, da weirdList2 speichern soll nur FileReader s.

Verwandte Themen