我有这个示例代码显示了不同的方法签名:
public class Main {
public static interface MyMap extends Map {}
public void func1(List<MyMap> m) {}
public void func2(List<Map> m) {}
public void func3(List<? extends Map> m) {}
public void func4(List<? extends Map<?, ?>> m) {}
public <M extends Map<?, ?>> void func5(List<M> m) {}
public static void main(String[] args) {
List<MyMap> myMap = null;
Main main = new Main();
main.func1(myMap); // OK
main.func2(myMap); // not applicable
main.func3(myMap); // OK
main.func4(myMap); // not applicable
main.func5(myMap); // OK
}
}
当我MyMap
扩展原始类型Map
时,我对Java中的方法签名兼容性存在这些混淆。
由于func1
是一个控制测试,显然IDE不会抱怨。在func2
中,我可以理解MyMap
并不完全是Map
,因此IDE正在抱怨。更新签名如func3
后,它再次起作用。至于func4
,我认为Map<?,?>
与原始类型Map
不同,这就是为什么IDE再次抱怨?但最令我困惑的是func5
,因为它看起来等同于func4
但是IDE没有抱怨?
答案 0 :(得分:0)
我认为这已经得到了解答:
Difference between Bounded Type parameter and Upper Bound Wildcard
只有例外,你添加了Raw Type Eresure,但我认为它不会以某种方式影响结果。
另外,我认为你可能会发现下一个有用的东西:
main.func4((List<? extends Map<?, ?>>) myMap); // OK, but unchecked warning