2012-04-20 66 views
3

请看看下面的代码片段:Java编译失败时使用泛型参数的内部类

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) 

它看起来不像可访问性问题,因为非静态内部类可以访问外部类的所有实例变量。看起来我在某处定义了我的泛型。任何人都可以解释我在这里做错了吗?

回答

3

封闭类的类型是内部类类型的一部分。 FooInner已经参数E,因为它是外部类的一部分;显式参数化是多余的和不正确的,因为它实际上试图引入一个与现有名称相同的新类型参数。只需要删除private class FooInner<E>中的<E>,那你就是金。

6

您已经使用相同的通用参数名称的内部类,所以内部类的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); 
     } 
    } 
}