必须有充分的理由,或者这个设计决策背后的一些历史 . 或许我误解了用例 .
背景:Google Guava有一个 Multimap
界面 . get
方法具有签名: Collection<V> get(@Nullable K key)
. 我期待: Collection<V> get(@Nullable Object key)
通常类似通用的类似 Map 的接口接受 Object
到 get
方法,因为它有助于使用通配符 . 请参阅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 回答
我想,只是因为当你提供错误的
get()
方法并且只返回null
而没有任何编译错误或运行时异常时,这消除了很多愚蠢的错误 . 代码中的这些问题只能使用像FindBugs这样的静态分析工具来发现(参见GC_UNRELATED_TYPES模式),但即使FindBugs也无法检测到每一个可能的错误 .至于你的情况:可能你必须使用引入泛型参数
并且您的键引用的每个实例都应该具有
T
类型 . 如果你不可能,那么你可以使用丑陋的未经检查的演员:将转换的multimap分配给中间变量可能是个好主意 .