我有此示例代码显示不同的方法签名:
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
扩展RAW类型Map
时,我对Java中的方法签名兼容性感到困惑。
如SEAD func1
是一个控制测试,显然IDE不会抱怨。在func2
中,我可以理解MyMap
并不完全是Map
,因此IDE在抱怨。更新签名之后,例如func3
,它再次起作用。对于func4
,我认为Map<?,?>
与RAW类型Map
不同,这就是为什么IDE再次抱怨?但是,最让我感到困惑的是func5
,因为它看起来等于func4
,但IDE没有抱怨?
我认为这已经回答:
有限类型参数与上限通配符之间的差异
唯一的例外,您添加了原始类型,但我认为这不影响结果。
另外,我认为您可能会发现下一个有用:
main.func4((List<? extends Map<?, ?>>) myMap); // OK, but unchecked warning