Java 谷歌为什么选择Guava';s Multimap.get(TKey)方法不接受对象?

Java 谷歌为什么选择Guava';s Multimap.get(TKey)方法不接受对象?,java,generics,dictionary,collections,multimap,Java,Generics,Dictionary,Collections,Multimap,这个设计决策背后一定有一个很好的理由,或者说有一些历史。或者我误解了用例 背景:谷歌番石榴有一个Multimap界面。get方法具有签名:Collection get(@Nullable K key)。我期望:Collection-get(@Nullable-Object-key) 通常,通用映射类接口接受Objecttoget方法,因为它有助于使用通配符。请参阅Java的Map接口(和) 我有一个方法可以接受带有通配符的多重映射,比如:voiddowork(我想多重映射),这是因为当您向get

这个设计决策背后一定有一个很好的理由,或者说有一些历史。或者我误解了用例

背景:谷歌番石榴有一个
Multimap
界面。
get
方法具有签名:
Collection get(@Nullable K key)
。我期望:
Collection-get(@Nullable-Object-key)

通常,通用映射类接口接受
Object
to
get
方法,因为它有助于使用通配符。请参阅Java的
Map
接口(和)


我有一个方法可以接受带有通配符的多重映射,比如:
voiddowork(我想多重映射),这是因为当您向
get()提供错误内容时,它可以消除很多愚蠢的错误
方法,只返回
null
,没有任何编译错误或运行时异常。代码中的此类问题只能使用静态分析工具(如FindBugs)发现(请参见模式),但即使FindBugs也无法检测到所有可能的此类错误

至于您的情况:可能您必须引入泛型参数,而不是使用

void <T extends MyKeyType> doWork(Multimap<T, ? extends MyValueType> mmap) {}

将浇铸多重映射分配给中间变量可能是一个好主意。

作为替代,您可以使用
asMap
获得
multimap
Map
视图。讽刺的是,Kevin Bourrillion(番石榴联合领导)在这里写了关于这个问题的文章:,并说:那么如何处理这个令人烦恼的bug源,如上图所示?好吧,当我在IntelliJ中键入代码时,它立即为我标记了一个警告。这让我知道如何解决问题或添加注释/注释以抑制它。问题已解决。@kevinarpe,您发布的链接与rted。这是更新的链接:顺便说一句,他不是MultiMap接口的作者。@Tagir,正如kevinarpe正确地提到的那样,使用好的编辑器可以捕获愚蠢的bug,但逻辑上API必须是正确的。
((Multimap<MyKeyType, ? extends MyValueType>)mmap).get(key)