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

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

53
задан skiphoppy 25 February 2010 в 06:30
поделиться

5 ответов

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

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

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

Here's a screenshot of changing the compiler in eclipse

99
ответ дан 7 November 2019 в 08:30
поделиться

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

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

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

16
ответ дан 7 November 2019 в 08:30
поделиться

безопасно ли вызывать этот метод из внутри web-страниц

Это действительно зависит от того, что вы делаете в методе. Этот метод, вероятно, должен быть функцией без побочных эффектов.

Создание нового потока для каждого page-call

Да.

does HttpContext.Current always return the current-users context, so is it safe to call that from static methods to get the current-users session??

Да.

Если вы хотите быть пуристом, не рекомендуется полагаться на статические методы, поскольку они затрудняют проверку вашего кода в изоляции. Если класс A вызывает статический метод класса B, вы никогда не сможете протестировать класс A без тестирования/вызова B

-121--3366954-

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

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

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

-121--1027239-

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

3
ответ дан 7 November 2019 в 08:30
поделиться

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

0
ответ дан 7 November 2019 в 08:30
поделиться

Прямой ответ на вопрос «Почему» возникает ошибка 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
ответ дан 7 November 2019 в 08:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: