将参数转换为泛型变量时的 Java 方法多态性



给定以下类

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$UpperClassBottomClass class Test$UpperClass,这不是我所期望的T extends UpperClass,我希望两者都会调用method(T),因为擦除TUpperClass。为什么叫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是什么类型。ObjectT具有相同的擦除这一事实在编译时无关紧要。你的例子是一个更复杂的演示。

最新更新