2013-04-02 35 views
5

此代碼:<? extends > Java語法

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

編譯錯誤的方法添加在 類型列表是不適用的(捕獲#1-延伸閱讀器?) 自變量(BufferedReader)

爲什麼? BufferedReader擴展了讀者,那爲什麼不是一個「匹配」?

+2

的可能重複[Java泛型通配符問題:列表(http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a) – yshavit

+0

(FWIW,你想要的這裏是'List ',而不是'List <?extends Reader>'。) –

回答

3

你給變量:

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>

6

當編譯器看到<? extends Reader>時,它假定它可能是任何類型的Reader。它可能與BufferedReader不兼容,如StringReader。因此,如果類定義中的泛型類型出現在諸如add之類的方法的參數中,並且實例的類型具有類似<? extends Something>的類型,則編譯器出於類型安全原因必須禁止它。在這個例子中,它可能可能是List<StringReader>,所以你不應該在這裏添加BufferedReader

6

List<? extends Reader> weirdList可以保存任何類型的List參考,其中存儲任何類型的Reader。因此,它是可能的

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

如果你的Java將允許您添加BufferedReaderweirdList1它也必須讓你添加BufferedReaderweirdList2(引用類型是一樣的),這是不是假設發生,因爲weirdList2應該存儲只有FileReader s。

相關問題