【问题标题】:Generic inner class with instance variable that is an object of another generic inner class具有实例变量的通用内部类,该实例变量是另一个通用内部类的对象
【发布时间】:2013-12-07 16:11:12
【问题描述】:

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

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

【问题讨论】:

  • 顺便说一句,这不是超类。
  • 糟糕,我想 OuterClass 应该是一个更合适的名称。

标签: java generics inner-classes


【解决方案1】:

正如错误试图告诉您的那样,您有两个不同的Es,它们可能是两种不同的类型。

如果您创建 new OuterClass&lt;Integer&gt;.ProblemClass&lt;String&gt;() 会发生什么?

【讨论】:

  • 所以如果我的内部类包含泛型的实例变量,但类型总是要匹配外部类的泛型类型,我可以避免泛型内部类吗?
  • @user2921933 是的,你可以。
  • @user2921933 - 当内部成员之一是 static 时,游戏会发生变化,那么您必须指定它们。
【解决方案2】:

很简单,ProblemClassEInnerClassE 不相关 - 您的代码相当于

public class SuperClass<E> {

    private class InnerClass<F> {
    }

    private class ProblemClass<G> {
        private InnerClass<G> o;

        public ProblemClass() {
            o = a;
        }
    }

    private InnerClass<E> a;
}

您可以清楚地看到ao 不一定兼容。

【讨论】:

    【解决方案3】:

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 2019-06-07
      • 2013-09-20
      • 2020-08-04
      • 2019-02-10
      • 2021-10-02
      • 2015-06-09
      • 1970-01-01
      • 2014-03-21
      相关资源
      最近更新 更多