首页 文章

为什么Google Guava的Multimap.get(TKey)方法不会接受Object?

提问于
浏览
2

必须有充分的理由,或者这个设计决策背后的一些历史 . 或许我误解了用例 .

背景:Google Guava有一个 Multimap 界面 . get 方法具有签名: Collection<V> get(@Nullable K key) . 我期待: Collection<V> get(@Nullable Object key)

通常类似通用的类似 Map 的接口接受 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) . (代码不会编译 . )

1 回答

  • 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)
    

    将转换的multimap分配给中间变量可能是个好主意 .

相关问题