如何使用番石榴将MultiMap<Integer, Foo> 转换为Map<Integer, Set<Foo>>?

2022-09-04 06:35:09

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


答案 1

看看这个问题,并评论#2由Kevin Bourrillion,番石榴开发负责人:

您可以将第一个双投到原始地图,然后双击到所需的地图。您必须禁止显示未经检查的警告,并且应该在此时注释,“安全,因为SetMultimap保证了这一点。我甚至可以更新SetMultimap javadoc来提及这个技巧。Map<K, Collection<V>>Map<K, Set<V>>

所以做未经检查的演员:

@SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this.
final Map<Integer, Set<OccupancyType>> mapOfSets = 
    (Map<Integer, Set<OccupancyType>>) (Map<?, ?>) pkgPOP.asMap();

编辑:

从番石榴15.0开始,你可以使用辅助方法以更优雅的方式做到这一点:

Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);

答案 2

番石榴贡献者在这里:

做不安全的演员。这将是安全的。

由于 Java 继承的工作方式,它无法返回 a。实质上,超类型必须返回 一个 ,并且由于 不是 的子类型,因此不能重写以返回 .Map<K, Set<V>>MultimapMap<K, Collection<V>>Map<K, Set<V>>Map<K, Collection<V>>asMap()Map<K, Set<V>>


推荐