如果具有以泛型类型
开头的类型层次结构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,再次检查它是否有效。
答案 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;
}
}
你的问题必须在别处。