子类不能转换为泛型父类

时间:2011-11-07 10:24:53

标签: java generics

如果具有以泛型类型

开头的类型层次结构
class A<T> { ... }
class B extends A<Qux> { ... }
class C extends B { ...}

到目前为止一切顺利。现在我有一个使用A作为参数的不同类(也是通用的):

class Foo<T> extends Bar<T> {
  setA(A<T> a){ ...}  
}

现在我想用这一切:

Foo<Qux> foo = new Foo<Qux>();
foo.setA(new C());

最后一行给出错误“类型Foo中的setA不是参数C的应用程序”。

我无法弄清楚出了什么问题。在我看来它应该工作,因为C扩展B扩展A,这是应该使用的参数类型...感谢任何暗示我的假设有什么问题。

更新:使用Oli发布的代码,我设法更接近错误的来源。一旦我用原始类替换B,就会发生这种情况。所以它必须位于不使用“通用”部分的类中。当试图转换为父类时,Eclipse说它不能。我会继续看那里,我知道它应该正常工作......问题可以归结为:

C c = new C();
A<Qux> a = (A<Qux>)c;

在我的代码中,这会导致错误

Cannot cast from C to A<Qux>

我仍然不知道为什么会这样。 是否有任何理由不能将子类强制转换为父类?没有这样的理由。因为如果你有这样的问题,它可能只是你的IDE。我出于其他原因重新启动Eclipse,再次检查它是否有效。

1 个答案:

答案 0 :(得分:3)

以下编辑对我来说很好:

public class Test {

    static class Qux {};

    static class A<T> {}
    static class B extends A<Qux> {}
    static class C extends B {}

    static class Bar<T> {}
    static class Foo<T> extends Bar<T> {
        void setA(A<T> a) {}
    }


    public static void main(String[] args) {
        Foo<Qux> foo = new Foo<Qux>();
        foo.setA(new C());

        // From question update
        C c = new C();
        A<Qux> a = c;
    }
}

你的问题必须在别处。