如何使用Guava将MultiMap 转换为Map <Integer,Set >?

我正在使用Google Guava 12中的MultiMap,如下所示:

Multimap pkgPOP = HashMultimap.create(); 

将值插入此multimap后,我需要返回:

 Map<Integer, Set> 

但是,当我这样做时:

 return pkgPOP.asMap(); 

它归还给我

 Map<Integer, Collection> 

如何返回Map<Integer, Set>

看看这个问题,评论#2由 Guava dev负责人Kevin Bourrillion发表 :

您可以先将Map>双重转换为原始地图,然后再转换为所需的Map> 。 您必须禁止未经检查的警告,此时您应该评论“安全,因为SetMultimap可以保证这一点。” 我甚至可以更新SetMultimap javadoc以提及这个技巧。

所以不选择演员:

 @SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this. final Map> mapOfSets = (Map>) (Map) pkgPOP.asMap(); 

编辑:

从Guava 15.0开始,您可以使用帮助方法以更优雅的方式执行此操作:

 Map> mapOfSets = Multimaps.asMap(pkgPOP); 

番石榴贡献者:

做不安全的演员。 这样会很安全。

由于Javainheritance的工作方式Map>它无法返回Map> 。 基本上, Multimap超类型必须返回Map> ,并且因为Map>不是Map>的子类型,所以你不能覆盖asMap()以返回Map>