给出以下课程
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)
?
答案 0 :(得分:2)
让我们简化:
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
具有相同擦除的事实在编译时无关紧要。你的例子是一个更复杂的演示。