2012-04-20 89 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); 
     } 
    } 
}