3
我有示出不同的方法簽名此示例代碼:Java方法簽名兼容性
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不是在抱怨嗎?