У меня есть класс типа enum:
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
? Как избавиться от него?
Я знаю, что добавление ключевого слова static
на printMe(){...}
решает проблему, но мне интересно узнать, есть ли другой способ, если я хочу сохранить 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
, но в итоге я получаю сообщение об ошибке:
поле "имя" не может быть объявлено статическим в нестационарном внутреннем типе.
Почему я не могу определить статическую константу внутри PLUS
, если PLUS
является анонимным классом? Два сообщения об ошибках звучат противоречиво друг другу, так как первое сообщение об ошибке говорит, что PLUS(){...}
имеет статический контекст, в то время как второе сообщение об ошибке сообщает, что PLUS(){...}
имеет нестатический контекст, Я еще больше запутался.