我正在使用Google Guava 12中的MultiMap:
Multimap<Integer, OccupancyType> pkgPOP = HashMultimap.create();
将值插入此multimap后,我需要返回:
Map<Integer, Set<OccupancyType>>
然而,当我这样做时:
return pkgPOP.asMap();
它让我回头
Map<Integer, Collection<OccupancyType>>
如何返回Map<Integer, Set<OccupancyType>>
?
答案 0 :(得分:16)
看看this issue and comment #2 by Kevin Bourrillion,领导Guava dev:
您可以先将
Map<K, Collection<V>>
双重投射到原始地图和 然后到你想要的Map<K, Set<V>>
。你必须压制一个 未经检查的警告,你应该在那一点评论,“安全,因为 SetMultimap保证了这一点。“我甚至可以更新SetMultimap javadoc提到这个技巧。
所以做未经检查的演员:
@SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this.
final Map<Integer, Set<OccupancyType>> mapOfSets =
(Map<Integer, Set<OccupancyType>>) (Map<?, ?>) pkgPOP.asMap();
修改强>
自Guava 15.0起,您可以使用helper method以更优雅的方式执行此操作:
Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);
答案 1 :(得分:10)
番石榴贡献者:
做不安全的演员。这将是安全的。
由于Java继承的工作方式,它无法返回Map<K, Set<V>>
。基本上,Multimap
超类型必须返回Map<K, Collection<V>>
,并且由于Map<K, Set<V>>
不是Map<K, Collection<V>>
的子类型,因此您无法覆盖asMap()
以返回Map<K, Set<V>>
。