12

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

Multimap<Integer, OccupancyType> pkgPOP = HashMultimap.create();

将值插入此多重映射后,我需要返回:

Map<Integer, Set<OccupancyType>>

但是,当我这样做时:

return pkgPOP.asMap();

它还给我

Map<Integer, Collection<OccupancyType>>

我怎样才能返回Map<Integer, Set<OccupancyType>>

4

2 回答 2

21

看看这个问题并评论 #2,Kevin Bourrillion是 Guava 开发负责人:

您可以将第一个双重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 开始,您可以使用辅助方法以更优雅的方式执行此操作:

Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);
于 2012-06-26T10:17:25.367 回答
10

番石榴贡献者在这里:

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

Map<K, Set<V>>由于 Java 继承的工作方式,它不能返回 a 。本质上,Multimap超类型必须返回 a Map<K, Collection<V>>,并且因为Map<K, Set<V>>不是 的子类型Map<K, Collection<V>>,所以您不能覆盖asMap()以返回 a Map<K, Set<V>>

于 2012-06-26T10:04:38.923 回答