映射与原始通用不接受具有指定泛型的参数

时间:2017-03-01 14:46:55

标签: java generics

我正在尝试使用包含多个地图的地图。每个子图包含一组类型域。但是,我不能给包含具有特定域的域的超级地图映射(例如:域)。

Domain<Spell> spells = new Domain<>("spells");

Map<String, Domain> map = new TreeMap<>();
map.put(spells.getName(), spells);

Map<String, Domain<Spell>> library = new TreeMap<>();
library.put(spells.getName(), spells);

Map<String, Map<String, Domain>> mapLibrary = new TreeMap<>();
mapLibrary.put("test", library);

但是我在最后一行代码中收到以下错误:

The method put(String, Map<String,Domain>) in the type Map<String,Map<String,Domain>> is not applicable for the arguments (String, Map<String,Domain<Spell>>)

我该怎么做才能拥有一张超级地图,其中包含多个具有不同通用参数的不同Domain的地图?

附加信息:有四个类可以扩展Magic:

- Spell extends Magic<Spell>
- Prayer extends Magic<Prayer>
- Mental extends Magic<Mental>
- Elemental extends Magic<Elemental>

超类具有泛型参数,因为它包含它所属的域,并且必须指定正确的域类型。

关于副本的修改:如上所述和评论中,我寻求找到解决方法来解决问题,而不是为什么。另一个问题的答案只是告诉了原因。

1 个答案:

答案 0 :(得分:0)

答案是Map<String, Map<String, ? extends Domain<?>>> mapLibrary = new TreeMap<>()

该错误消息告诉您Map<String, Domain<Spell>>无法分配给Map<String, Domain>。这是@ john16384评论的内容,List<Dog>不是List<Animal>。但是List<Dog>List<? extends Animal>。因此,您应该将泛型声明为Map<String, Map<String, ? extends Domain<?>>