2015-12-28 169 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!