Почему javac терпит неудачу на аннотации @Override - PullRequest
52 голосов
/ 25 февраля 2010

Eclipse добавляет аннотации @Override, когда я реализую методы интерфейса. Затмение, похоже, не имеет проблем с этим. И наш автоматизированный процесс сборки от Cruise Control, похоже, не имеет проблем с этим. Но когда я строю из командной строки, когда муравей запускает 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. Круиз-контроль работает под управлением Java 1.5. Моя сборка муравья не работает независимо от того, какую версию Java я использую.

Ответы [ 8 ]

99 голосов
/ 25 февраля 2010

Спецификация аннотации @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

16 голосов
/ 25 февраля 2010

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

JDK 6 позволит @Override на любом из них.

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

3 голосов
/ 26 марта 2010

Прямой ответ на вопрос «Почему» возникает ошибка 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 ...

3 голосов
/ 25 февраля 2010

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

1 голос
/ 17 сентября 2012

Многие люди, в том числе и я, были обижены этим. Смотрите здесь для большего обсуждения SO

0 голосов
/ 30 августа 2017

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

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

до:

javac.compiler=modern

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

0 голосов
/ 12 февраля 2014

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

Пример: HttpServletRequest

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

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

0 голосов
/ 25 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...