我有两种方法,第一种需要Map<ItemA, ItemB>
第二种Map<ItemA ,ItemB[]>
。我如何创建一个涵盖两种情况的通用映射?Java在泛型上使用泛型有两种类型
0
A
回答
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
)一般不工作。
2
在我看来,你不能,除非创建一个Map<ItemA, Object>
这不会满足你的需要。
但是,您也可以创建一个Map<ItemA, ItemB[]>
并在fyl上对需要非收集值的方法进行转换。
1
我认为你可以做的最好的是Map<ItemA, ?>
。 ItemB
和ItemB[]
在类型层次结构方面几乎没有关系。
然后,您必须使用instanceof
或其他东西来弄清楚哪些是哪些和分别处理它们。所以你还不如不打扰,并有ItemB
和ItemB[]
:)
0
单独的方法,如果你真的想这样做,并没有使用数组来代替列表中的任何特殊原因,我建议创建一个地图>地图和处理不同的案件;列表中只有一个元素或多个元素。 但正如其他人指出,它似乎是两个不同的情况,应该是两个不同的地图。
我检查了该地图的进一步使用,我认为这是处理该地图的最佳方式。谢谢。 – 2010-03-19 08:11:26