我用一个私有成员变量创建了一个枚举.当我尝试访问成员变量时,编译状态'无法对非静态字段memberVariable进行静态引用'.
如果变量不是私有的(例如受保护或包保护),则编译很好.我不明白变量的范围与实现的抽象函数的类型(静态,非静态)有什么关系.
有人可以开导我吗?
public enum EnumWithAbstractMethodAndMembers {
TheOneAndOnly(1) {
@Override
public int addValue(final int value) {
return memberVariable + value;
}
};
private final int memberVariable;
private EnumWithAbstractMethodAndMembers(final int memberVariable) {
this.memberVariable = memberVariable;
}
abstract int addValue(int value);
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*rey 21
错误消息令人困惑.
问题是当你给出一个枚举值代码时,你正在创建一个enum的匿名子类.(它的类将是EnumWithAbstractMethodAndMembers$1)一个子类不能访问其超类的私有成员,但是嵌套类可以通过生成的访问器方法.您应该能够访问私有字段,它给您的错误消息似乎是错误的.
BTW您可以使用此功能,但您不需要恕我直言.
public int addValue(final int value) {
return super.memberVariable + value;
}
Run Code Online (Sandbox Code Playgroud)
这是一个较短的示例,我将在错误消息中记录为错误,因为它不会导致问题的解决方案.
public enum MyEnum {
One {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}
public int getMemberVariable2OK() {
return memberVariable2;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
};
private final int memberVariable = 1;
final int memberVariable2 = 1;
}
Run Code Online (Sandbox Code Playgroud)
根据Tom Hawkin的反馈,此示例获得相同的错误消息.
public class MyNotEnum {
// this is the static context in which the anonymous is created
public static final MyNotEnum One = new MyNotEnum() {
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;
}
Run Code Online (Sandbox Code Playgroud)
为了比较
public class MyNotEnum {
public class NestedNotEnum extends MyNotEnum {
public int getMemberVariableFailes() {
// compiles just fine.
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
}
private final int memberVariable = 1;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4365 次 |
| 最近记录: |