鉴于以下课程

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)

最佳答案

让我们简化一下:

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

08-19 23:18