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 は、private 内部クラス内で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 に答える