[英]Java method signature compatibility
我有这个示例代码显示不同的方法签名:
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并不抱怨?
我想这已经回答了:
只有例外,你添加了Raw Type Eresure,但我不认为它会以某种方式影响结果。
另外,我认为你可能会发现下一个有用的:
main.func4((List<? extends Map<?, ?>>) myMap); // OK, but unchecked warning
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.