2017-03-05 108 views
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不是在抱怨嗎?

回答