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-当其中一个内部类是
静态的时,游戏会改变,然后你必须指定它们。