首先,我意识到我可以使ProblemClass
成为非泛型类而不会收到编译器错误。我想知道这个错误意味着什么。我的代码非常简单,是一个带有两个私有内部类的泛型类。外部类具有类型InnerClass<E>
的实例变量,内部类ProblemClass<E>
也具有类型InnerClass<E>
的实例变量。当实例化ProblemClass`时,它所做的就是设置 o = a ,其中 o,a 分别是外部类和内部类的实例变量。
public class SuperClass<E> {
private class InnerClass<E> {
}
private class ProblemClass<E> {
private InnerClass<E> o;
public ProblemClass() {
o = a;
}
}
private InnerClass<E> a;
}
我收到以下错误。
SuperClass.java:11: error: incompatible types
o = a;
^
required: SuperClass<E#1>.InnerClass<E#2>
found: SuperClass<E#1>.InnerClass<E#1>
where E#1,E#2 are type-variables:
E#1 extends Object declared in class SuperClass
E#2 extends Object declared in class SuperClass.ProblemClass
1 error
我的问题是,这个错误是什么意思?
答案 0 :(得分:4)
很简单E
的{{1}}和ProblemClass
E
无关 - 您的代码等同于
InnerClass
您可以清楚地看到public class SuperClass<E> {
private class InnerClass<F> {
}
private class ProblemClass<G> {
private InnerClass<G> o;
public ProblemClass() {
o = a;
}
}
private InnerClass<E> a;
}
和a
不一定兼容。
答案 1 :(得分:1)
正如错误试图告诉您的那样,您有两种不同的E
可能是两种不同的类型。
如果您创建new OuterClass<Integer>.ProblemClass<String>()
会怎样?
答案 2 :(得分:0)
@IanRoberts有答案,你的一些E
不一样。
以下是代码的修复版本:
public class SuperClass<SE> {
private class InnerClass<IE> {
}
private class ProblemClass<PE> {
private InnerClass<SE> o;
public ProblemClass() {
o = a;
}
}
private InnerClass<SE> a;
}