Почему 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...
Ответ 5
Множество людей, в том числе и меня, получили это. См. здесь для более крупной дискуссии SO
Ответ 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
Это решило проблему, и проект был скомпилирован и успешно развернут.