2009-11-04 85 views
6

這段代碼怎麼沒有編譯?Java:這怎麼不編譯?

class A 
{ 
    class B 
    { 
    public enum Enum <-- this line 
    { 
     AD, 
     BC 
    } 
    } 
} 

編譯報道:

enum declarations allowed only in static contexts. 

但後來當我把裏面的枚舉類A,一切都還好。

這很令人驚訝。我不認爲我在C++中遇到了這個問題。

回答

10

您可以通過B上配置靜態解決這個問題:

static class B { ... 

這更密切什麼C++確實有嵌套類鏡子。默認情況下(不包括static),B的實例包含對A實例的隱藏引用。

有關這些差異的很好的解釋可以在Java inner class and static nested class找到。

+7

枚舉是一種內在靜態的野獸。在上面的例子中,你只希望有一個Enum.AD對象。但是如果你在一個非靜態類中聲明一個枚舉,你會(理論上)需要一個不同的Enum.AD實例用於每個合併範圍。這沒有道理......因此它是被禁止的。 – 2009-11-04 06:59:32