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 楼答案
方法重载解析发生在编译时
当编译器编译
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>