簡體   English   中英

<? extends> Java語法

[英]<? 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM