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扩展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

最新更新