我有两种方法,第一种需要Map<ItemA, ItemB>
,第二种需要Map<ItemA ,ItemB[]>
。如何创建涵盖这两种情况的通用Map?
答案 0 :(得分:2)
你做不到。这怎么样?如果第一种方法执行map.get(key)
并获得ItemB[]
而不是ItemB
,则会使用ClassCastException
投诉。
通用集合的重点是将这两种情况分开。
你可以创建一个包装器,将Map<ItemA, ItemB>
包装为Map<ItemA, ItemB[]>
,返回一个只包含一个元素的数组。但这可能会导致数组操作语义的麻烦。
也许只是复制一切:
// upgrade from Map to MultiMap
HashMap<ItemA, ItemB[]> map1Copy = new HashMap<ItemA, ItemB[]>(map1.size());
for (Entry<ItemA, ItemB> e: map1.entrySet()){
map1Copy.put(e.getKey(), new ItemB[]{ e.getValue()});
}
另一个方向(将ItemB[]
转换为单个ItemB
)通常不起作用。
答案 1 :(得分:2)
除非创建一个无法满足您需求的Map<ItemA, Object>
,否则我不能这样做。
但是,您也可以为需要非收集值的方法创建Map<ItemA, ItemB[]>
并转换fyl。
答案 2 :(得分:1)
我认为你能做的最好是Map<ItemA, ?>
。 ItemB
和ItemB[]
在类型层次结构方面几乎无关。
然后你必须使用instanceof
或其他东西来确定哪个是哪个并单独处理它们。因此,您可能不会为ItemB
和ItemB[]
分别设置单独的方法:)
答案 3 :(得分:0)
如果您真的想要这样做并且没有任何特殊原因使用数组而不是列表,我建议创建一个Map&gt;映射和处理不同的案例;列表中只有一个元素或多个元素。 但正如其他人指出的那样,它似乎是两个不同的情况,应该是两个不同的地图。