[英]<? extends > Java syntax
這段代碼:
List<? extends Reader> weirdList;
weirdList.add(new BufferedReader(null));
有一個編譯錯誤
在類型List中添加(捕獲#1-of?extends Reader)的方法不適用於參數(BufferedReader)
為什么? BufferedReader擴展了讀者,為什么不是“匹配”呢?
當編譯器看到<? extends Reader>
<? extends Reader>
,然后它假定它可以是任何類型或擴展Reader
。 它可能與BufferedReader
兼容,例如StringReader
。 因此,如果類定義中的泛型類型出現在諸如add
之類的方法的參數中,並且實例的類型具有類似於<? extends Something>
的類型<? extends Something>
<? extends Something>
,由於類型安全原因,編譯器必須禁止它。 在此示例中,它可能是List<StringReader>
,因此您不能在此處添加BufferedReader
。
List<? extends Reader> weirdList
List<? extends Reader> weirdList
可以保存對存儲任何類型Reader
任何類型List
引用。 所以有可能
List<? extends Reader> weirdList1 = new ArrayList<BufferedReader>();
List<? extends Reader> weirdList2 = new ArrayList<FileReader>();
如果Java允許你將BufferedReader
添加到weirdList1
,它還必須讓你將BufferedReader
添加到weirdList2
(引用類型是相同的),因為weirdList2
應該只存儲FileReader
,所以不會發生這種情況。
對於您給出的變量:
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>
的變量類型List<? extends Reader>
List<? extends Reader>
可以保存任何一種類型的值(以及更多!),Java調用該錯誤。
Java中的泛型很難理解。 你可以想到List<? extends Reader>
List<? extends Reader>
type List<? extends Reader>
為對方法中的賦值或參數類型最有用,以便它們可以接受各種類型。 對於“常規使用”,你最好選擇像List<Reader>
這樣的“裸”通用,甚至是List<BufferedReader>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.