[英]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,因為我沒有不知道該類型是否為字符串。”
這個項目解決了我的問題:
我在上面的解釋中唯一的問題是形式的構造
List<? super T> myList;
帖子繼續說,您可以將任何類型T添加到myList或任何T的Supertype 實例 。 那似乎不准確。 看起來您只能添加T或其任何子類型,因為T的子類型自動是T的任何超類型的子類型。 在那里有點含糊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.