Java 如何转换多重映射<;整数,Foo>;映射<;整数,集合<;Foo>&燃气轮机;用番石榴?
我使用Google Guava 12的MultiMap,如下所示:Java 如何转换多重映射<;整数,Foo>;映射<;整数,集合<;Foo>&燃气轮机;用番石榴?,java,set,guava,Java,Set,Guava,我使用Google Guava 12的MultiMap,如下所示: Multimap<Integer, OccupancyType> pkgPOP = HashMultimap.create(); 它还我 Map<Integer, Collection<OccupancyType>> Map 我如何返回Map 做不安全的演员。会安全的 由于Java继承的工作方式,它不能返回映射。本质上,Multimap超类型必须返回一个Map,因为Map不是Map的子类
Multimap<Integer, OccupancyType> pkgPOP = HashMultimap.create();
它还我
Map<Integer, Collection<OccupancyType>>
Map
我如何返回
Map
做不安全的演员。会安全的
由于Java继承的工作方式,它不能返回映射。本质上,Multimap
超类型必须返回一个Map
,因为Map
不是Map
的子类型,所以不能重写asMap()
来返回Map看,番石榴头:
您可以先将贴图
双重强制转换为原始贴图,然后
然后转到所需的映射。你必须抑制一个
未选中的警告,您应该在该点上发表评论,“安全,因为
SetMultimap保证了这一点。“我甚至可以更新SetMultimap
javadoc提到了这个技巧
你也应该这样做:
@SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this.
final Map<Integer, Set<OccupancyType>> mapOfSets =
(Map<Integer, Set<OccupancyType>>) (Map<?, ?>) pkgPOP.asMap();
@SuppressWarnings(“unchecked”)//安全,因为SetMultimap保证了这一点。
最终地图地图集=
(Map)(Map)pkgPOP.asMap();
编辑:
自Guava 15.0以来,您可以使用以下更优雅的方式:
Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);
Map-mapofset=Multimaps.asMap(pkgPOP);
Louis,你根本没睡,是吗?;)我对(Set)MultiMap使用什么实现重要吗?(在我的例子中,我使用的是HashMultiMap)。如果我使用这样的东西,SetMultiMap-mapOfSets=LinkedListMultiMap.create()
那么,LinkedListMultiMap
是一个ListMultimap
,而不是SetMultiMap
。只要使用一些SetMultimap
实现,例如LinkedHashMultimap
或TreeMultimap
,就可以了。(还有@Xaerxess,我在英国时间度过夏天。)@LouisWasserman谢谢!您和Xaerxess的回复对我来说都是很好的答案。我确信最右边的演员必须是普通的Map
,但这可能是因为我们不再关心的javac版本。。。不确定。
@SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this.
final Map<Integer, Set<OccupancyType>> mapOfSets =
(Map<Integer, Set<OccupancyType>>) (Map<?, ?>) pkgPOP.asMap();
Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);