Ограниченный wilcard не работает для списка, вставленного в карту

#java #wildcard #nested-generics

#java #подстановочный знак #вложенные дженерики

Вопрос:

Следующий код объясняет мою проблему:

 interface f1 {}

interface f2 extends f1{}


1. List<? extends f1> l1 = new ArrayList<f2>();

2. Map<String, ? extends f1> m1 = new HashMap<String, f2>();

3. Map<String, List<? extends f1>> m2 = new HashMap<String, List<f2>>();
  

№ 1 и 2 работают, но № 3 выдает ошибку в eclipse. В нем говорится: Type mismatch: cannot convert from HashMap<String,List<f2>> to Map<String,List<? extends f1>> Не могли бы вы, пожалуйста, помочь мне понять, почему.

Ответ №1:

Использовать

 Map<String, ? extends List<? extends f1>> m2 = new HashMap<String, List<f2>>();
  

Комментарии:

1. Большое спасибо. Это работает. Не могли бы вы объяснить логику, стоящую за этим?

2. Когда вы не используете оператор подстановки? вы указываете ровно один конкретный тип, например, String . Вы не можете сделать что-то вроде List<Object> l = new ArrayList<String>() ; То же самое происходит с аргументами вложенного типа. У вас есть карта, содержащая строки и что-то, что расширено из списка, который содержит что-то, что расширено из f1.