【问题标题】:Why does Google Guava's Multimap.get(TKey) method not instead accept Object?为什么 Google Guava Multimap.get(Key) 方法不接受 Object?
【发布时间】:2016-03-24 17:43:26
【问题描述】:

这个设计决定背后一定有充分的理由或一些历史。或者我可能误解了用例。

背景:Google Guava 有一个Multimap 接口。 get 方法具有签名:Collection<V> get(@Nullable K key)。我预计:Collection<V> get(@Nullable Object key)

通常通用的类似地图的接口接受Objectget 方法,因为它有助于使用通配符。请参阅 Java 的 Map 接口(和 What are the reasons why Map.get(Object key) is not (fully) generic)。

我有一个方法可以接受带有通配符的 Multimap,例如:void doWork(Multimap<? extends MyKeyType, ? extends MyValueType>)。然而,即使有MyKeyType 参考,我也不能(有效地)调用Multimap.get(? extends MyKeyType)。 (代码不会编译。)

【问题讨论】:

    标签: java generics dictionary collections multimap


    【解决方案1】:

    我猜,只是因为当您向 get() 方法提供错误信息并且只返回 null 而没有任何编译错误或运行时异常时,这消除了许多愚蠢的错误。代码中的此类问题只能使用 FindBugs 之类的静态分析工具(请参阅GC_UNRELATED_TYPES 模式)发现,但即使是 FindBugs 也无法检测到所有可能的此类错误。

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

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

    您的关键引用的每个实例实际上都应该具有T 类型。如果这对您来说不可能,那么您可以像这样使用丑陋的未经检查的演员表:

    ((Multimap<MyKeyType, ? extends MyValueType>)mmap).get(key)
    

    将强制转换的多图分配给中间变量可能是个好主意。

    【讨论】:

    • 作为替代方案,您可以使用asMap 获取MapMultimap 视图。
    • 具有讽刺意味的是,Kevin Bourrillion(Guava 联合负责人)在这里写了这篇文章:smallwig.blogspot.com/2007/12/…,并说:那么如何处理这个令人烦恼的错误来源,如上图所示?好吧,当我将该代码输入 IntelliJ 时,它会立即向我发出警告。这让我知道要么解决问题,要么添加注释/评论来抑制它。问题解决了。
    • @kevinarpe,您发布的链接有点失真。这是更新的链接:smallwig.blogspot.in/2007/12/…
    • 顺便说一句,他不是 MultiMap 界面的作者。 @Tagir,正如 kevinarpe 正确提到的,可以使用好的编辑器捕获愚蠢的错误,但逻辑上 API 必须是正确的。
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2020-03-28
    • 2018-06-27
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多