Java HashMap/HashSet多态性

Java HashMap/HashSet多态性,java,hashmap,hashset,method-invocation,Java,Hashmap,Hashset,Method Invocation,我有一个继承链,其中超类有3个直接子类,子类1,子类2,子类3 我有一个: HashMap<Integer, HashMap<Integer, HashSet<Superclass>>> map = new HashMap<>(); HashMap map=newhashmap(); 我希望映射包含3个整数值为1、2和3的哈希映射。这3个HashMap的每个HashSet值只包含超类的一个子类 例如map.get(1)应该引用 HashMap&

我有一个继承链,其中超类有3个直接子类,子类1,子类2,子类3

我有一个:

HashMap<Integer, HashMap<Integer, HashSet<Superclass>>> map = new HashMap<>();
HashMap map=newhashmap();
我希望映射包含3个整数值为1、2和3的哈希映射。这3个HashMap的每个HashSet值只包含超类的一个子类

例如map.get(1)应该引用

HashMap<Integer, HashSet<Subclass1>>
HashMap
但由于编译器错误,我不允许将上述HashMap添加到map:

(actual argument HashMap<Integer, HashSet<Subclass1>> cannot be converted to
HashMap<String, HashSet<Superclass>> by method invocation conversion)
(实际参数HashMap无法转换为
HashMap(按方法调用转换)

因为我们的OP似乎不相信您可以创建对象数组(主要是ArrayList),所以让我们来学习一些基础知识

ArrayList<String>[] arrayOfArraylists = new ArrayList[10];
arrayOfArraylists[0] = new ArrayList<String>();
ArrayList[]ArrayOfarrayList=新建ArrayList[10];
ArrayOfarrayList[0]=新的ArrayList();
太棒了

现在来看原始问题

Map<Integer, Map<Integer,HashSet<? extends SuperClass>>> map = new HashMap<>();
map.put(1, new HashMap<Integer, HashSet<? extends SuperClass>>());
map.get(1).put(2, new HashSet<SubClass>());

Map如果希望能够在运行时将子类添加到哈希集中,则可以将变量声明为:

HashMap<Integer, HashMap<Integer, HashSet<? extends Superclass>>> map ...

hashMap,然后再回答这里的泛型问题。如果你想用数字1、2和3对HashMap进行索引,那你到底为什么要用HashMap呢?因为我无法生成ArrayList数组。。从构思开始,我的数组列表就变成了哈希集,因为我不想重复。因此,我选择用一个映射替换不可用的数组。这不是映射的作用吗?将键(索引)与某些值关联?为什么不创建一个映射数组?你从哪里把ArrayList放进这一个。。。仅仅使用映射来映射3个索引是没有意义的。自从我选择制作HashMap以来,已经有相当长的一段时间了,但是当我这么做的时候,我确信制作ArrayList数组是不可能的。我想地图也是这样?我会解释我想做什么,你可以告诉我怎么做:我有大约一百个单独的对象。我需要一个基于3个整数值只返回其中一个的方法。这100个对象分为6个不同的类别,每个类别包含3个子类别,每个子类别包含一定数量的对象。ArrayList数组绝对是可能的,就像任何其他类或接口的数组一样。我不确定三层嵌套地图是否是存储物品的最佳方式。好吧,这就是我在研究答案时偶然发现的。。但是看看这个帖子:“新HashSet
HashMap<Integer, HashMap<Integer, HashSet<? extends Superclass>>> map ...