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

时间:2017-11-22 04:16:13

标签: java generics casting polymorphism

给出以下课程

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)称为T的删除是UpperClass。为什么要调用method(BottomClass)

1 个答案:

答案 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是什么类型。 ObjectT具有相同擦除的事实在编译时无关紧要。你的例子是一个更复杂的演示。