2012-12-08 79 views
4

在我的應用程序,有這行代碼造成麻煩:如何使用泛型參數擴展非靜態類?

public class DisplayListing<R extends Listing<R, L>, L extends Listing<R, L>.Loader> extends SherlockListFragment { ... } 

與Eclipse一切工作行爲都正常。但切換到IntelliJ IDEA後,出現錯誤:

沒有在範圍內包含'com.app.Listing'類型的封閉實例。

此錯誤消息引用部分Listing<R, L>.Loader(Loader是一個非靜態類)。

當我轉到IntelliJ的首選項並將編譯器從Javac更改爲Eclipse時,我回到了業務:應用程序將成功編譯並再次運行。

但是,指示錯誤的紅色標記將保留(我想擺脫這一點)。所以我想知道如果我真的做錯了什麼,我的通用參數應該被修復,或者如果可以依賴Eclipse編譯器並忽略錯誤?

+0

代碼在我的IntelliJ中看起來很好。你使用Java 1.7嗎? – irreputable

+0

我剛剛更新到1.7,但問題保持不變。除此之外,我在javac和EJC之間切換了幾次,並使IntelliJ緩存失效,並突然用javac編譯成功。即使上述部分仍然標記爲錯誤... – Taig

+0

'Loader'的可見性是什麼? – artbristol

回答

3

這是一個合法的錯誤,並且它可以在沒有任何複雜的泛型被再現:

public class Foo<T extends Bar.Baz> {} 

class Bar { 
    class Baz {} 
} 

看來,的IntelliJ解析器(未它的編譯器,其是javacecj)被弄錯extends Bar.Baz到成爲Foo聲明的一部分,而不是T。換句話說,這是同樣的錯誤,當你這樣做,你(正確地)得到:

public class Foo extends Bar.Baz {} 

這是IDEA Issue #94011。你可以通過提高這個問題來給予更多的關注。

+0

非常感謝,我在兩者之間添加了自己的報告。看起來我不能刪除它... – Taig