Java 具有实例变量的泛型内部类,该实例变量是另一个泛型内部类的对象
首先,我意识到我可以使Java 具有实例变量的泛型内部类,该实例变量是另一个泛型内部类的对象,java,generics,inner-classes,Java,Generics,Inner Classes,首先,我意识到我可以使ProblemClass成为非泛型类,并且不会收到编译器错误。我想知道这个错误意味着什么。我的代码非常简单,是一个具有两个私有内部类的泛型类。外部类有一个InnerClass类型的实例变量,而内部类ProblemClass也有一个InnerClass类型的实例变量。当ProblemClass`被实例化时,它所做的就是设置o=a,其中o,a分别是外部类和内部类的实例变量 public class SuperClass<E> { private class
ProblemClass
成为非泛型类,并且不会收到编译器错误。我想知道这个错误意味着什么。我的代码非常简单,是一个具有两个私有内部类的泛型类。外部类有一个InnerClass
类型的实例变量,而内部类ProblemClass
也有一个InnerClass
类型的实例变量。当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;
}
公共类超类{
私有类内部类{
}
私有类问题{
私家车o类;
公共问题类(){
o=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
SuperClass.java:11:错误:不兼容的类型
o=a;
^
必需:SuperClass.InnerClass
找到:SuperClass.InnerClass
其中E#1、E#2是类型变量:
E#1扩展了类超类中声明的对象
E#2扩展了类SuperClass.ProblemClass中声明的对象
1错误
我的问题是,这个错误是什么意思?正如错误试图告诉您的那样,您有两种不同的
E
s,可能是两种不同的类型
如果创建一个
新的OuterClass.ProblemClass()
,会发生什么?非常简单ProblemClass的E
和InnerClass的E
是不相关的-您的代码相当于
public class SuperClass<E> {
private class InnerClass<F> {
}
private class ProblemClass<G> {
private InnerClass<G> o;
public ProblemClass() {
o = a;
}
}
private InnerClass<E> a;
}
公共类超类{
私有类内部类{
}
私有类问题{
私家车o类;
公共问题类(){
o=a;
}
}
甲级私人楼宇;
}
你可以清楚地看到a
和o
不一定是兼容的。@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;
}
公共类超类{
私有类内部类{
}
私有类问题{
私家车o类;
公共问题类(){
o=a;
}
}
甲级私人楼宇;
}
BTW,这不是超类。Woops,我想OuterClass应该是一个更合适的名称。因此,如果我的内部类包含泛型实例变量,但类型总是与外部类的泛型类型匹配,我可以避免泛型内部类?@user2921933是的,你可以。@user2921933-当其中一个内部类是静态的时,游戏会改变,然后你必须指定它们。