2016-04-08 26 views
2

以下是一直困擾我的代碼示例。與地圖不兼容的類型錯誤

如果我嘗試創建一個有界類型的集合並將另一個變量指定爲另一個無界未知類型的集合的變量,則代碼將工作。

List<? extends Number> numberList = new ArrayList<>(); 
List<?> anotherList = numberList; // OK 

如果我嘗試在Map中做同樣的事情,我會得到「不兼容的類型」錯誤。

Map<String, List<? extends Number>> numberMap = new HashMap<>(); 
Map<String, List<?>> anotherMap = numberMap; // ERROR 

錯誤說:

Map<String,List<? extends Number>> cannot be converted to Map<String,List<?>> 

是不是Map<String,List<? extends Number>>一種類型的Map<String,List<?>>

這裏是全班爲了您的方便https://ideone.com/AZgV9H

我試圖理解爲什麼這是行不通的,我應該怎麼改變它,以使其發揮作用。

+3

泛型是**不**協變。就像「列表」不是「列表」,「地圖>」不是「地圖」。 –

+0

[是列表列表的子類?爲什麼不是Java的泛型隱含多態?](http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p) – Pshemo

回答

2

僅僅因爲一個List<? extends Number>List<?>亞型並不意味着Map<String, List<? extends Number>>Map<String, List<?>>出於同樣的原因,一個List<Number>不是List<?>亞型亞型 - Java的泛型是不變的。

要讓List<Number>成爲List<?>的子類型,必須添加帶有邊界的通配符。解決方案是相同的 - 將? extends添加到List<?>

Map<String, ? extends List<?>> anotherMap = numberMap;