2015-12-28 167 views
2

當嵌套枚舉類試圖訪問外部時,它會收到有關無法訪問靜態上下文中的非靜態字段的錯誤消息。但是,將字段包置於本地,或者使用超級關鍵字「修復」問題,這在錯誤消息中並不明顯。嵌套枚舉不能訪問枚舉類的私有字段

如果枚舉是一個嵌套類,那就沒有三人

public enum EnumExample { 
One { 
    public int getMemberVariableFailes() { 
     // error: non-static variable memberVariable cannot be referenced from a static context 
     return memberVariable; 
    } 

    public int getMemberVariableOK() { 
     return super.memberVariable; 
    } 

    public int getMemberVariable2OK() { 
     return memberVariable2; 
    } 
}; 

private final int memberVariable = 1; 
final int memberVariable2 = 1; 
} 

預期 -

的錯誤消息不說清楚,採用了超。關鍵字會「解決」問題。它看起來不是正確的行爲,但如果是錯誤信息,則不會提供解決方案。

實際 - 與下面相同的行爲。

However following compiles absolutely fine. 

public class Enumtest { 
public class NestedNotEnum extends Enumtest { 
    public int getMemberVariableFailes() { 
     // compiles just fine. 
     return memberVariable; 
    } 

    public int getMemberVariableOK() { 
     return super.memberVariable; 
    } 
} 
private final int memberVariable = 1; 
} 

可有一個闡述爲什麼發生這種情況。

+1

如果兩個EnumExample的子類的一個實例,和靜態嵌套類EnumExample的。該字段在超類中定義,並應可供子類訪問。因此它應該被保護而不是私人的。 –

+1

@JBNizet,你是​​對的,但恕我直言,錯誤信息的文本是有點混亂。 '一個'確實是靜態成員和'EnumExample'的一個子類。作爲一個子類,它不應該能夠訪問super的私有成員。但是,如果明確寫出「超級」字,就可以。恕我直言,這是奇怪的... – AlexR

+0

是的,這也是我的擔憂...文本消息是相當混亂,我運行它在Linux和solaris上都和Java 6和Java 7,但得到了相同的答案... :( –

回答

0

那麼,聲明的enum和提供的內部類示例之間是有區別的。您應該將枚舉看作'靜態嵌套類'和而不是'內部類'。現在,提供的類實例轉換爲:

public class Enumtest 
{ 
    static class NestedNotEnum extends Enumtest { 
     public int getMemberVariableFailes() { 
      // error: non-static variable memberVariable cannot be referenced from a static context 
      return memberVariable; 
     } 

     public int getMemberVariableOK() { 
      return super.memberVariable; 
     } 
    } 
    private final int memberVariable = 1; 
} 

不是這些結果類似於您的期望?與EnumExample相同,請使用關鍵字super解決問題。然而,這仍然是奇怪的:

不能使靜態參考非靜態字段memberVariable

因爲我們仍然能夠通過使用super指memberVariable!