簡體   English   中英

通用Map.entrySet()的返回類型

[英]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>的子類型一樣,即使StringObject的子類型。

暫無
暫無

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

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