簡體   English   中英

如果Java String擴展了Object,那么為什么不能將其傳遞給 <? extends Object> 類型

[英]If Java String extends Object then why cant it be passed to <? extends Object> type

例如,為什么以下各項不起作用?

Map<String, ? extends Object> table = new HashMap<>();
table.put("K", "V"); //Error V cannot be applied to ? extends String.

但是String必須擴展Object,為什么上面拋出編譯器錯誤?

我得到的IntelliJ錯誤是

Wrong 2nd Argument Type. Found 'java.lang.String'required: '? extends java.lang.Object'

但是,以下工作原理:

Map<String, ? super Object> table = new HashMap<>();
table.put("K", "V"); //Error V cannot be applied to ? extends String.

現在,以上內容確實很奇怪。 下限對象如何工作?

我的意思是不

? super Object

是指“未知的對象超類”?

AFAIK對象位於Java類層次結構的根。

因為? extends Object ? extends Object並不表示“任何擴展Object的類型”。 它的意思是“某種特定的類型,只要它擴展了Object,我們就不知道它是什么。” 區別是細微的,但意義重大!

以下代碼完全可以編譯:

Map<String, Integer> stringToInteger = new HashMap<>();
Map<String, ? extends Object> stringToWildcard = stringToInteger;

可以編譯是有道理的。 stringToWildcard是一個映射,其值是“某種類型,只要它擴展對象”,而Integer是一種擴展對象的類型。

因此,假設您的table.put("K", "V")工作。 我們可以這樣做:

Map<String, Integer> stringToInteger = new HashMap<>();

Map<String, ? extends Object> stringToWildcard = stringToInteger;
stringToWildcard.put("K", "V");

Integer value = stringToInteger.get("K");

這將導致最后一行出現ClassCastException,因為字符串“ V”無法轉換為整數。

相反,編譯器將禁止table.put("K", "V") 它告訴您的是:“嘿,值必須是某種特定類型。除了擴展對象之外,我不知道該類型是什么。但是我不能讓您放入String,因為我沒有不知道該類型是否為字符串。”

這個項目解決了我的問題:

如何添加到列表<? 擴展Number>數據結構?

我在上面的解釋中唯一的問題是形式的構造

List<? super T> myList;

帖子繼續說,您可以將任何類型T添加到myList或任何T的Supertype 實例 那似乎不准確。 看起來您只能添加T或其任何子類型,因為T的子類型自動是T的任何超類型的子類型。 在那里有點含糊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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