我有一个枚举类型的类:
public enum Operation {
PLUS() {
@Override
double apply(double x, double y) {
// ERROR: Cannot make a static reference
// to the non-static method printMe()...
printMe(x);
return x + y;
}
};
private void printMe(double val) {
System.out.println("val = " + val);
}
abstract double apply(double x, double y);
}
正如您在上面看到的,我定义了一个枚举类型enum
,它有一个值为PLUS
。它包含了一个常量特定的主体。在它的主体中,我试图调用printMe(val);
,但是我得到了编译错误:
无法将静态引用转换为非静态方法printMe()。
为什么会出现这个错误?我的意思是我正在覆盖PLUS
体中的一个抽象方法。为什么它在static
范围内?如何摆脱它?
我知道在printMe(){...}
上添加static
关键字可以解决问题,但如果我想保持printMe()
为非静态的,是否有另一种方法呢?
另一个问题,与上述问题非常相似,但这次的错误消息听起来相反,即PLUS(){...}
具有非静态上下文:
public enum Operation {
PLUS() {
// ERROR: the field "name" can not be declared static
// in a non-static inner type.
protected static String name = "someone";
@Override
double apply(double x, double y) {
return x + y;
}
};
abstract double apply(double x, double y);
}
我试图声明一个 PLUS
特定的 static
变量,但最终出现了错误:
无法在非静态内部类型中声明字段“name”为静态。
如果 PLUS
是匿名类,为什么不能在其中定义静态常量?这两个错误信息听起来互相矛盾,因为第一个错误信息说 PLUS(){...}
具有 静态 上下文,而第二个错误消息说 PLUS(){...}
具有 非静态 上下文。我现在更加困惑了。
printMe()
函数的访问权限改为protected,并在apply()
函数内部调用this.printMe(val)
。 - Alex SalauyouprintMe
方法在你的枚举中是私有的,每一个枚举都是枚举类的实现,因此它们无法访问其父类中的私有方法。令我困惑的是错误的本质。 - Edwin Dalorzoenum
的匿名子类将无法看到其父类的字段。修复方法是将private void printMe(double val) {
改为protected
。 - EpicPandaForce