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

时间:2015-12-18 04:14:06

标签: java generics dictionary collections multimap

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

背景: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)。 (代码不会编译。)

1 个答案:

答案 0 :(得分: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分配给中间变量可能是个好主意。

相关问题