Java在Map上使用泛型有两种类型

时间:2010-03-19 07:55:12

标签: java generics

我有两种方法,第一种需要Map<ItemA, ItemB>,第二种需要Map<ItemA ,ItemB[]>。如何创建涵盖这两种情况的通用Map?

4 个答案:

答案 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, ?>ItemBItemB[]在类型层次结构方面几乎无关。

然后你必须使用instanceof或其他东西来确定哪个是哪个并单独处理它们。因此,您可能不会为ItemBItemB[]分别设置单独的方法:)

答案 3 :(得分:0)

如果您真的想要这样做并且没有任何特殊原因使用数组而不是列表,我建议创建一个Map&gt;映射和处理不同的案例;列表中只有一个元素或多个元素。 但正如其他人指出的那样,它似乎是两个不同的情况,应该是两个不同的地图。