У меня есть класс типа 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);
}
Я пытаюсь объявить переменную static
, специфичную для PLUS
, но получаю ошибку:
поле «имя» не может быть объявлено статическим в нестатическом внутреннем типе.
Почему я не могу определить статическую константу внутри PLUS
, если PLUS
является анонимным классом? Два сообщения об ошибке звучат противоречиво, так как первое сообщение об ошибке говорит, что PLUS(){...}
имеет статический контекст, а второе сообщение об ошибке говорит, что PLUS(){...}
имеет нестатический контекст. Теперь я еще больше запутался.
printMe()
защищенным и вызватьthis.printMe(val)
внутриapply()
- person Alex Salauyou   schedule 10.03.2015printMe
является закрытым в вашем перечислении, каждое из ваших перечислений является реализацией класса перечисления, поэтому у них нет доступа к частному методу в их родительском классе. Меня озадачивает характер ошибки. - person Edwin Dalorzo   schedule 10.03.2015enum
не увидит поле своего родителя. Исправление состоит в том, чтобы сделатьprivate void printMe(double val) {
protected
- person EpicPandaForce   schedule 15.04.2015