我有以下逻辑
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的实际类?
方法重载解析在编译时发生。
[当编译器正在编译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>
。