Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型-集合中的Java集合_Java_Generics_Collections_Nested - Fatal编程技术网

泛型-集合中的Java集合

泛型-集合中的Java集合,java,generics,collections,nested,Java,Generics,Collections,Nested,我不熟悉泛型,所以不确定我会错在哪里 我有一些类,叫做Cat、Dog和Rabbit,它们实现了接口Animal 下面的代码将编译 Set<? extends Animal> animalSet; Set<Dog> dogSet = new HashSet<Dog>(); animalSet = dogSet; Map<String, ? extends Set<? extends Animal>> animalMap; Map<

我不熟悉泛型,所以不确定我会错在哪里

我有一些类,叫做Cat、Dog和Rabbit,它们实现了接口Animal

下面的代码将编译

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

Set至于原因,让我稍后再谈。
现在请注意,这将编译:

Map<String, Set<? extends Animal>> animalMap;
Map<String, Set<? extends Animal>> dogMap 
    = new HashMap<String, Set<? extends Animal>>();
Set<Dog> dogMapVal = new HashSet<Dog>();
dogMap.put("fido", dogMapVal);
animalMap = dogMap; 

Map因为Java是强类型的:
?extends Animal
不是
Dog
,它可能是
Cat
,也可能是另一个子类


例如,在这种情况下,如果在此处定义
Set,则父子关系的工作方式与parent p=child中的工作方式不同

因为狗不等于动物,只是扩展了它

如图所示,如果你在某个地方使用了一个代码,那么你把狗放在其中。之后,你又想用它了,你认为你把狗放在这里了,所以你把狗找回来了。但是如果有人,把猫或兔子放进去


这就是为什么。

基本上,当你写:

Map<String, Set<? extends Animal>> animalMap;
其中,
acatSet
是一个
集合

但是
dogMap
不能接受
Set
作为值,它只能接受
Set
。因此,存在类型不兼容的可能性,这就是为什么禁止这种构造

编辑:至于如何修复,这取决于您想做什么。如果您在某处有一个
狗图
,并且希望将其内容放入
动物地图
中,那么您可以简单地复制如下内容:

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);

Map将以下逻辑(基于)应用于您的问题:

  • 动物

  • Set
    Set您的问题的解决方案如下:

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

    MapHere父子关系不像parent p=child中那样有效。相关:您需要深入了解。谢谢。我能理解你的代码为什么会编译。但我希望“狗图”只包含几组狗,在上面执行一些操作,这些操作只是相对于狗而不是所有动物,然后稍后将其分配给“animalMap”。谢谢你的编辑,这是一个非常简洁的小解决方案,只是我意识到它有多么简单…@claire你的问题是我哪里出了问题?不是如何修复;)
    
    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);
    
    Map<String, ? extends Set<? extends Animal>> animalMap;
    Map<String, Set<Dog>> dogMap = new HashMap<String, Set<Dog>>();
    animalMap = dogMap;