Eclipse любит это, javac ненавидит его, это перечисление, вроде, с интерфейсом

Eclipse индиго, java 1.6

public interface I {
  String getName();
}

/* and in another file */

public enum E implements I {
  E1() {
     String getName() { return "foo"; }
  };
}

В Eclipse это сработало! Другие классы могут ссылаться на getName() на ссылки типа I. Фактический javac отклонил его, утверждая, что в перечислении не было такой вещи, как getName(). Это просто ошибка Eclipse?

Обратите внимание, что это связано с определением метода внутри счетчика. Все это отлично работает как в Eclipse, так и в Javac, если я делаю обычную вещь и имею функцию, указанную в нижней части перечисления, возвращающую значение поля.

Ответ 1

Сначала я согласен с @yshavit.

В противном случае это может быть связано с этим: Обходной путь для ошибки порядка компиляции javac в maven

Я думаю, что это имя связано с порядком. Попробуйте переименовать интерфейс A, он может скомпилироваться первым, и все должно работать.

Ответ 2

getName() в E1 должно быть public - это то, что вызывает проблемы? В противном случае вы пытаетесь переопределить общедоступный метод (все методы, объявленные в интерфейсах, являются общедоступными) с помощью метода private-private, который не разрешен.

Ответ 3

Методы интерфейсов являются общедоступными. Увеличьте уровень видимости в вашем перечислении, и он должен успешно скомпилироваться. В качестве побочного примечания ваш код показывает ошибку компиляции в моей версии Eclipse (Indigo работает на Mac 0S X 10.7.2, JDK 1.6).

Ответ 4

Имейте в виду, что Eclipse реализует свой собственный синтаксический анализатор и компилятор, который обеспечивает вывод, который жестко связывается с ним. Обычно он работает очень хорошо; однако, когда появляется новая функция языка, компилятор имеет тенденцию отставать в реализации новой языковой функции.

Командная строка javac (почти) всегда правильная, если вы получаете свой javac из Oracle/SUN.

Ответ yshavit лучше всего, поскольку он определяет причину, по которой он не должен компилироваться в Eclipse. К настоящему моменту я предполагаю, что он исправлен (и правильно не будет компилироваться в Eclipse).