2

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

我有一个:

HashMap<Integer, HashMap<Integer, HashSet<Superclass>>> map = new HashMap<>();

我希望映射包含整数值 1、2 和 3 的 3 个哈希图。这 3 个哈希图的每个哈希集的值都只包含超类的一个子类。

例如 map.get(1) 应该参考

HashMap<Integer, HashSet<Subclass1>>

但是由于编译器错误,我不允许将上面的 HashMap 添加到映射中:

(actual argument HashMap<Integer, HashSet<Subclass1>> cannot be converted to
HashMap<String, HashSet<Superclass>> by method invocation conversion)
4

2 回答 2

2

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

HashMap<Integer, HashMap<Integer, HashSet<? extends Superclass>>> map ...
于 2013-10-02T13:00:31.440 回答
0

由于我们的 OP 似乎不相信您可以创建对象数组(主要是 ArrayLists),让我们来了解一些基础知识。

ArrayList<String>[] arrayOfArraylists = new ArrayList[10];
arrayOfArraylists[0] = new ArrayList<String>();

惊人。

现在解决原来的问题。

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

我不知道我是否想像这样对地图进行分层,或者我是否会费心将第一张地图仅用于 3 个项目。

您可以创建一个索引类并且只有一层地图。

Map<Triplet, HashSet<? extends SuperClass>> map = new HashMap<>();
map.put(new Triplet(1, 2, 3), new HashSet<SubClass>());
于 2013-10-02T13:00:10.373 回答