2016-08-18 47 views
0

我有TaskVO作为基类。 我有TaggingTaskVo它延伸TaskVO指定具体地图到通用类型地图

下面是我的两个地图声明,第一个版本是使用通用和第二个版本是专门的。

Map<String, List<? extends TaskVO>> genericTaskVoMap = new HashMap<String, List<? extends TaskVO>>(); 
Map<String, List<TaggingTaskVo>> taskVoMap = new HashMap<String, List<TaggingTaskVo>>(); 

为什么我不能将taskVoMap赋值给genericTaskVoMap?

genericTaskVoMap = taskVoMap;  //Type mismatch: cannot convert from Map<String,List<TaggingTaskVo>> to Map<String,List<? extends TaskVO>> 

但是,当我给对方分配类型列表它不会抱怨。

List<? extends TaskVO> genericTaskVoList = new ArrayList<>(); 
List<TaskVO> taskVoList = new ArrayList<TaskVO>(); 
genericTaskVoList = taskVoList; //No compilation error 

回答

2

您需要另一个通配符来进行assignement:“扩展列表”,因为我知道这将是列表,那么为什么使用通配符

Map<String, ? extends List<? extends TaskVO>> genericTaskVoMap = new HashMap<String, ? extends List<? extends TaskVO>>(); 
+0

东西有点怪 –

+1

这有做嵌套通配符原则,请查看此网站http://bayou.io/draft/Capturing_Wildcards.html#Nested_Wildcards“捕获转换仅适用于顶级通配符,不适用于嵌套通配符。” –