给定以下类(class)
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
具有相同删除的事实在编译时是无关紧要的。您的示例是一个更复杂的演示。
关于将参数转换为泛型变量时的 Java 方法多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426701/