[英]Return type of generic Map.entrySet()
Map.entrySet()聲明為:
Set<Map.Entry<K, V>> entrySet();
我在某個地方定義了這樣的變量:
Map<? extends Number, String> wildCardMap = new HashMap<>();
現在,我假設參數param K是? 擴展Number ,我可以這樣做:
Set<Map.Entry<? extends Number, String>> entries = wildCardMap.entrySet();
但這會導致編譯錯誤,我必須編寫:
Set<? extends Map.Entry<? extends Number, String>> entries = wildCardMap.entrySet();
有人可以解釋為什么在Map.Entry之前必須使用通配符嗎?
通配符? extends Number
? extends Number
是指某些特定的(我們未知)類型,擴展Number
。 因此,讓我們嘗試一種可能的類型為Integer
,看看會發生什么:
Map<Integer, String> wildCardMap;
// doesn't compile
Set<Map.Entry<? extends Number, String>> entries = wildCardMap.entrySet();
為什么? 因為wildCardMap.entrySet()
返回Set<Map.Entry<Integer, String>>
,它不是Set<Map.Entry<? extends Number, String>>
的子類型Set<Map.Entry<? extends Number, String>>
Set<Map.Entry<? extends Number, String>>
。
泛型是不變的,並且類型參數必須完全匹配,除非類型參數是通配符。 更深層次的通配符不算在內(這只是類型的一部分)。 Set<Map.Entry<Integer, String>>
不是Set<Map.Entry<? extends Number, String>>
的子類型Set<Map.Entry<? extends Number, String>>
Set<Map.Entry<? extends Number, String>>
,即使Map.Entry<Integer, String>
是Map.Entry<? extends Number, String>
的子類型Map.Entry<? extends Number, String>
Map.Entry<? extends Number, String>
,就像List<String>
不是List<Object>
的子類型一樣,即使String
是Object
的子類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.