如何将MultiMap <integer,foo =“”>转换为Map <integer,set <foo =“”>&gt;使用Guava?</integer,> </integer,>

时间:2012-06-26 09:15:47

标签: java set guava

我正在使用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>>

2 个答案:

答案 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>>