Guava:将Multimap强制转换为泛型超类型是否有效?

时间:2016-04-11 04:00:11

标签: java generics casting guava multimap

目前,我正在实施Multimap类,以允许使用Multisets进行重复。特别是,我正在研究boolean putAll(Multimap<? extends K, ? extends V> multimap)方法。

我想这样做:

Map<K, Collection<V>> map = ((Multimap<K, V>)multimap).asMap();

asMap()通常会返回Map<? extends K, Collection<? extends V>>

这是否有效(如果我没有添加到地图中,则不会抛出错误)?如果没有,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

其他人已经涵盖了您的具体问题,但我认为您提出了错误的问题(并试图做一些您不应该做的事情)。

首先,我想问一下你为什么要自己实施Multimap。你似乎可以避免这样做。

其次,您尝试使用map.putAll(Map)添加传递到asMap()实施的Multimap的{​​{1}}视图。这几乎肯定是错误的,会违反Multimap.putAll(Multimap)的规范。 Multimap.putAll视图中的Collection值是关联键值的实时视图,当多图更改时,其内容将更改。如果您将这些集合直接添加到asMap(),您可能已支持Map实施,那么如果之后修改了其他Multimap,则Multimap将最终更改。不仅如此,如果您的Multimap已经拥有该密钥的值,会发生什么?