有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java两级泛型奇怪的行为

我有以下逻辑


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的输出意味着编译器在测试中选择第二个方法,这是奇怪的还是我遗漏了什么?java不应该知道Gen#test的实际类吗


共 (1) 个答案

  1. # 1 楼答案

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

    当编译器编译Gen<E>时,它对E一无所知,也就是说,它不能保证E扩展A,因此它必须用<E>调用test的重载

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

    要让它调用另一个,请更改为Gen<E extends A>