必须有充分的理由,或者这个设计决定背后的一些历史。或许我误解了用例。
背景:Google Guava有一个Multimap
界面。 get
方法具有签名:Collection<V> get(@Nullable K key)
。我期待:Collection<V> get(@Nullable Object key)
通常类似于地图的接口接受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)
。 (代码不会编译。)
答案 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分配给中间变量可能是个好主意。