gpt4 book ai didi

java - 泛型 - 集合中的 Java 集合

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:14 25 4
gpt4 key购买 nike

我是泛型的新手,所以不确定我哪里出错了......

我有名为 Cat、Dog 和 Rabbit 的类,它们实现了 Animal 接口(interface)。

下面的代码可以编译

Set<? extends Animal> animalSet;
Set<Dog> dogSet = new HashSet<Dog>();
animalSet = dogSet;

但是下面的代码不会

Map<String, Set<? extends Animal>> animalMap;
Map<String, Set<Dog>> dogMap = new HashMap<String, Set<Dog>>();
animalMap = dogMap; // this line will not compile

编译器说类型不兼容。我哪里错了?

更新

感谢大家的帮助

我通过添加另一个通配符更改了第一行代码以下代码将编译

Map<String, ? extends Set<? extends Animal>> animalMap;
Map<String, Set<Dog>> dogMap = new HashMap<String, Set<Dog>>();
animalMap = dogMap;

另请参阅下面 Cyrille Ka 给出的解决方案 - 使用 putAll() 将值从 dogMap 传输到 animalMap,而不是将 dogMap 分配给 animalMap。

最佳答案

基本上,当你写的时候:

Map<String, Set<? extends Animal>> animalMap;

您声明映射的任何值都是一个集合,该集合可以包含任何类型为 Animal 子类的对象。那么客户端代码编写将是完全合理的:

animalMap.put("miaow", aCatSet);

哪里acatSetSet<Cat> .

但是dogMap不能接受 Set<Cat>作为值(value),它只能接受Set<Dog> .因此存在类型不兼容的可能性,这就是禁止这种构造的原因。

编辑:至于如何解决,这取决于你想做什么。如果你有 dogMap某处并希望将其内容放入 animalMap然后你可以像这样简单地复制内容:

Map<String, Set<? extends Animal>> animalMap = new HashMap<String, Set<? extends Animal>>();
Map<String, Set<Dog>> dogMap = new HashMap<String, Set<Dog>>();

/// fill dogMap

animalMap.putAll(dogMap);

关于java - 泛型 - 集合中的 Java 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19839169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com