Java二级泛型奇怪行为

问题描述 投票:1回答:1

我有以下逻辑


public class Why {

    public static void main(String[] args) {
        Gen<A> gen = new Gen<>();
        gen.m(new A()); //eeeeeeeeee A
    }
}

class A {}

class B extends A {}

class C extends A {}

class Gen<E> {
    Test test = new Test();

    public void m(E e) {
        test.test(e);
    }
}

class Test {

    public <E extends A> void test(E e) {
        System.out.println("XXXXXXXXXX " + e.getClass().getSimpleName());
    }

    public <E> void test(E e) {
        System.out.println("eeeeeeeeee " + e.getClass().getSimpleName());
    }

}

main的输出意味着编译器选择了Test中的第二种方法,这很奇怪还是我错过了什么? Java是否应该知道Gen#test的实际类?

java generics type-parameter
1个回答
1
投票

方法重载解析在编译时发生。

[当编译器正在编译Gen<E>时,它对E一无所知,即它不能保证E扩展了A,因此它必须使用test调用<E>的重载。 。

如果删除了test()的重载,则会出现编译错误,因为另一个完全不兼容:The method test(E extends A) in the type Test is not applicable for the arguments (E)

要使其呼叫另一个,请更改为Gen<E extends A>

© www.soinside.com 2019 - 2024. All rights reserved.