3

请看下面的代码片段:

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)

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

4

2 回答 2

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);
        }
    }
}
于 2012-04-20T00:51:12.853 回答
3

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

于 2012-04-20T00:29:18.650 回答