List<? extends Reader> weirdList;
weirdList.add(new BufferedReader(null));
有
編譯錯誤的方法添加在 類型列表是不適用的(捕獲#1-延伸閱讀器?) 自變量(BufferedReader)
爲什麼? BufferedReader擴展了讀者,那爲什麼不是一個「匹配」?
List<? extends Reader> weirdList;
weirdList.add(new BufferedReader(null));
有
編譯錯誤的方法添加在 類型列表是不適用的(捕獲#1-延伸閱讀器?) 自變量(BufferedReader)
爲什麼? BufferedReader擴展了讀者,那爲什麼不是一個「匹配」?
你給變量:
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>
。
當編譯器看到<? extends Reader>
時,它假定它可能是任何類型的或Reader
。它可能與BufferedReader
不兼容,如StringReader
。因此,如果類定義中的泛型類型出現在諸如add
之類的方法的參數中,並且實例的類型具有類似<? extends Something>
的類型,則編譯器出於類型安全原因必須禁止它。在這個例子中,它可能可能是是List<StringReader>
,所以你不應該在這裏添加BufferedReader
。
List<? extends Reader> weirdList
可以保存任何類型的List
參考,其中存儲任何類型的Reader
。因此,它是可能的
List<? extends Reader> weirdList1 = new ArrayList<BufferedReader>();
List<? extends Reader> weirdList2 = new ArrayList<FileReader>();
如果你的Java將允許您添加BufferedReader
到weirdList1
它也必須讓你添加BufferedReader
到weirdList2
(引用類型是一樣的),這是不是假設發生,因爲weirdList2
應該存儲只有FileReader
s。
的可能重複[Java泛型通配符問題:列表 extends A>(http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a) – yshavit
(FWIW,你想要的這裏是'List',而不是'List <?extends Reader>'。) –