2016-08-18 2 views
0

У меня TaskVO как базовый класс. У меня есть TaggingTaskVo, который расширяет TaskVOПрисвоение бетонной карте общей типографской карте

Ниже моя декларация две карты, первый вариант использует Generic и вторая версия специализирована.

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

Вам нужен другой подстановочные для выполнения присваивания: «расширяет список»

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 «Преобразование захвата применяется только к маскам верхнего уровня, а не к вложенным подстановочным знакам». –