Java方法签名兼容性

时间:2017-03-05 13:50:24

标签: java methods signature method-signature

我有这个示例代码显示了不同的方法签名:

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没有抱怨?

1 个答案:

答案 0 :(得分:0)

我认为这已经得到了解答:

Difference between Bounded Type parameter and Upper Bound Wildcard

只有例外,你添加了Raw Type Eresure,但我认为它不会以某种方式影响结果。

另外,我认为你可能会发现下一个有用的东西:

main.func4((List<? extends Map<?, ?>>) myMap); // OK, but unchecked warning