给定以下类
public class Test<T extends Test.UpperClass> {
public static class BottomClass {}
public static class UpperClass extends BottomClass {}
public void method(BottomClass c) {
System.out.println("BottomClass " + c.getClass());
}
public void method(T c) {
System.out.println("UpperClass " + c.getClass());
}
public void test() {
method(new UpperClass());
}
public static void main(String[] args) {
new Test<UpperClass>().method(new UpperClass()); // calls method(T)
new Test<UpperClass>().test(); // calls method(BottomClass)
}
}
上面的代码如果执行,将打印出UpperClass class Test$UpperClass
和BottomClass class Test$UpperClass
,这不是我所期望的T extends UpperClass
,我希望两者都会调用method(T)
,因为擦除T
UpperClass
。为什么叫method(BottomClass)
?
让我们简化一下:
public class Foo<T> {
void method(T t) {}
void test() {
method(new Object()); // compiler error: is T Object?
}
public static void main(String[] args) {
new Foo<Object>().test();
new Foo<String>().test(); // both must compile!
}
}
上面的方法调用无法编译,因为实例无法知道T
是什么类型。Object
和T
具有相同的擦除这一事实在编译时无关紧要。你的例子是一个更复杂的演示。