鉴于以下课程
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
具有相同擦除的事实在编译时无关紧要。您的示例是一个更复杂的说明。