Почему javac не работает при аннотации @Override

Eclipse добавляет аннотации @Override, когда я реализую методы интерфейса. У Eclipse, похоже, нет проблем с этим. И наш автоматизированный процесс сборки от Cruise Control, похоже, не имеет проблем с этим. Но когда я строю из командной строки, с ant запуском javac, я получаю эту ошибку:

[javac] C:\path\project\src\com\us\MyClass.java:70: method does not override a method from its superclass
[javac]     @Override
[javac]      ^
[javac] 1 error

Eclipse работает под Java 1.6. В Cruise Control работает Java 1.5. My ant build не работает независимо от используемой версии Java.

Ответ 1

@Override аннотации @Override изменена в Java 1.6. В Java 1.5 компилятор не разрешал аннотацию @Override для реализованных методов интерфейса, но в 1.6 это разрешено. Первый результат поиска, который я нашел, - это запись в блоге здесь. , Это не было хорошо задокументировано, но оно изменилось.

Eclipse добавляет его, потому что ваш Eclipse настроен на соответствие 1.6. Вы должны попытаться сохранить среду сборки и затмения в одной и той же версии Java. Мне непонятно, как вы указали, что Cruise Control использует Java 5, независимо от того, компилируется ли он с использованием отдельного JDK6 или нет.

Отдельно от приведенных выше правил аннотаций 1.5 и 1.6 @Override помните, что Eclipse имеет собственную реализацию компилятора (не javac) и иногда будет вести себя по-разному. Когда что-то компилируется в Eclipse, но не в Ant или Maven, вам нужно найти способ сделать оба компилятора счастливыми.

Here's a screenshot of changing the compiler in eclipse

Ответ 2

Я не могу объяснить причину, которую вы видите, но, похоже, она связана с тем, что JDK 5 не разрешает @Override реализованные методы интерфейса, только при переопределенных методах, присутствующих в супер классе.

JDK 6 разрешит @Override для любого из них.

Если ваша сборка ant не работает, она может передавать параметр source в javac, запрашивая соответствие JDK 5.

Ответ 3

Теги @Override для реализованных методов являются новыми для Java 1.6. В Java 1.5 @Override корректно только при переопределении метода в базовом классе. Читайте больше здесь и здесь.

Ответ 4

Прямой ответ на вопрос "Почему" ошибка вызвана javac, когда @Override используется в контексте реализации метода, фактически соответствует спецификациям java:

"Обоснование этого состоит в том, что конкретный класс, реализующий интерфейс, обязательно переопределит все методы интерфейса независимо от аннотации @Override, и поэтому было бы странно сблизить семантику этой аннотации с правила для реализации интерфейсов."

См. http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4

Но, видимо, кто-то передумал для java 1.6 и 1.5 u21...

Ответ 6

Eclipse будет указывать на версию 1.6 вместо Java. См. здесь для настройки java-версии в eclipse.

Ответ 7

Убедитесь, что существует только одно определение этого интерфейса.

Пример:   HttpServletRequest

Это интерфейс с различными спецификациями в зависимости от поставщика.

Сравните pax-web-jetty и apache-felix-причал. У них разные методы.

Ответ 8

У меня была такая же проблема при создании проекта с ANT. Решение проблемы состояло в том, чтобы изменить следующее свойство внутри файла build.properties:

javac.compiler=org.eclipse.jdt.core.JDTCompilerAdapter

в

javac.compiler=modern

Это решило проблему, и проект был скомпилирован и успешно развернут.