具有实例变量的通用内部类,该实例变量是另一个通用内部类的对象

时间:2013-11-22 17:14:12

标签: java generics inner-classes

首先,我意识到我可以使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

我的问题是,这个错误是什么意思?

3 个答案:

答案 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;
}