2017-03-05 102 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不是在抱怨吗?

回答