【问题标题】:Java compilation failure when using generics parameter in inner class在内部类中使用泛型参数时 Java 编译失败
【发布时间】:2012-05-01 14:14:36
【问题描述】:

请看下面的代码sn-p:

interface IFoo<E>{
    void doFoo(E env);
}

class A<E>{
    public void doA(E env){}
}

public class Foo<E> implements IFoo<E>{
    public A<E> a;

    @Override
    public void doFoo(E env) {
        a.doA(env);
    }

    private class FooInner<E> implements IFoo<E>{

        @Override
        public void doFoo(E env) {
            a.doA(env);
        }
    }
}

Eclipse 在私有内部类 a.doA(env) 内部抱怨以下消息。

The method doA(E) in the type A<E> is not applicable for the arguments (E)

这似乎不是可访问性问题,因为非静态内部类可以访问外部类的所有实例变量。看起来我在某处定义了我的泛型错误。谁能解释我在这里做错了什么?

【问题讨论】:

    标签: java generics inner-classes


    【解决方案1】:

    封闭类的类型是内部类类型的一部分。 FooInner 已经E 参数化,因为它是外部类的一部分;显式参数化是多余且不正确的,因为它实际上是在尝试使用与现有参数相同的名称来引入新的类型参数。只需删除private class FooInner&lt;E&gt; 中的&lt;E&gt;,就可以了。

    【讨论】:

      【解决方案2】:

      您已经为内部类使用了相同的通用参数名称,因此内部类的类型 E 与外部类的 E 相比隐藏

      从内部类中删除泛型参数,如下所示:

      public class Foo<E> implements IFoo<E>{
      
          ...
      
          private class FooInner implements IFoo<E>{ // "E" here is the same "E" from Foo
      
              @Override
              public void doFoo(E env) {
                  a.doA(env);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多