Следует ли аннотировать метод, реализующий интерфейсный метод @Override
?
Javadoc в Override
аннотации говорится:
Указывает, что объявление метода предназначено для переопределения объявления метода в суперклассе. Если метод аннотирован этим типом аннотации, но не переопределяет метод суперкласса, компиляторы должны генерировать сообщение об ошибке.
Я не думаю, что интерфейс технически суперкласс. Или это?
java
oop
interface
annotations
Бенно Рихтерс
источник
источник
Ответы:
Вы должны использовать @Override всякий раз, когда это возможно. Это предотвращает совершение простых ошибок. Пример:
Это не компилируется, потому что не корректно переопределяется
public boolean equals(Object obj)
.То же самое касается методов, которые реализуют интерфейс (только 1.6 и выше ) или переопределяют метод класса Super.
источник
Я считаю, что поведение javac изменилось - с 1.5 это запретило аннотацию, с 1.6 - нет. Аннотация предоставляет дополнительную проверку во время компиляции, поэтому, если вы используете 1.6, я бы пошел на это.
источник
Вы должны всегда аннотировать методы,
@Override
если они доступны.В JDK 5 это означает переопределение методов суперклассов, в JDK 6 и 7 это означает переопределение методов суперклассов и реализацию методов интерфейсов. Причина, как упоминалось ранее, заключается в том, что он позволяет компилятору перехватывать ошибки, когда вы думаете, что переопределяете (или реализуете) метод, но на самом деле определяете новый метод (другую сигнатуру).
equals(Object)
По сравнению сequals(YourObject)
примером является стандартным примером, но тот же самый аргумент может быть сделан для реализаций интерфейса.Я предполагаю, что причина, по которой нет необходимости комментировать методы реализации интерфейсов, заключается в том, что JDK 5 пометил это как ошибку компиляции. Если JDK 6 сделает эту аннотацию обязательной, это нарушит обратную совместимость.
Я не являюсь пользователем Eclipse, но в других IDE (IntelliJ)
@Override
аннотация добавляется только при реализации методов интерфейса, если проект задан как проект JDK 6+. Я предположил бы, что Затмение похоже.Однако я бы предпочел увидеть другую аннотацию для этого использования, возможно,
@Implements
аннотацию.источник
Я бы использовал это при каждой возможности. См. Когда вы используете аннотацию @Override в Java и почему?
источник
JDK 5.0 не позволяет вам использовать
@Override
аннотацию, если вы реализуете метод, объявленный в интерфейсе (его ошибка компиляции), но JDK 6.0 позволяет это. Так что, может быть, вы можете настроить предпочтения вашего проекта в соответствии с вашими требованиями.источник
Если конкретный класс не переопределяет абстрактный метод, использование
@Override
для реализации является открытым вопросом, поскольку компилятор неизменно предупреждает вас о любых невыполненных методах. В этих случаях может быть выдвинут аргумент, что это снижает читабельность - в вашем коде читается больше вещей и, в меньшей степени, вызывается@Override
и нет@Implement
.источник
Переопределение ваших собственных методов, унаследованных от ваших собственных классов, обычно не нарушает рефакторинг с использованием ide. Но если вы переопределите метод, унаследованный от библиотеки, рекомендуется использовать его. Если вы этого не сделаете, вы часто получите не ошибку при более позднем изменении библиотеки, но хорошо скрытую ошибку.
источник
Это не проблема с JDK. В Eclipse Helios он допускает аннотацию @Override для реализованных методов интерфейса, в зависимости от того, JDK 5 или 6. Что касается Eclipse Galileo, аннотация @Override недопустима, в зависимости от того, JDK 5 или 6.
источник
Для меня часто это единственная причина, по которой некоторый код требует компиляции Java 6. Не уверен, стоит ли это того.
источник
Читая javadoc в java8, вы можете найти следующее в объявлении переопределения интерфейса:
Если метод аннотирован этим аннотационным типом, компиляторы должны генерировать сообщение об ошибке, если не выполнено хотя бы одно из следующих условий:
Поэтому, по крайней мере, в java8 вы должны использовать @Override для реализации метода интерфейса.
источник
Сам Eclipse добавит
@Override
аннотацию, когда вы скажете ему «генерировать нереализованные методы» во время создания класса, реализующего интерфейс.источник
Проблема с включением
@Override
заключается в том, что это заставляет вас думать, что вы забыли вызватьsuper.theOverridenMethod()
метод, что очень запутанно . Это должно быть кристально ясно. Возможно, Java должен предложить@Interface
использовать здесь. Ну да ладно, еще одна недоделанная особенность Java ...источник
В Java 6 и более поздних версиях вы можете использовать
@Override
для метода, реализующего интерфейс.Но я не думаю, что это имеет смысл: переопределение означает, что у вас есть метод в суперклассе, и вы реализуете его в подклассе.
Если вы реализуете интерфейс, я думаю, что мы должны использовать
@Implement
или что-то еще, но не@Override
.источник
Для интерфейса использование @Override вызвало ошибку компиляции. Итак, я должен был удалить это.
Сообщение об ошибке отправлено "
The method getAllProducts() of type InMemoryProductRepository must override a superclass method
".Это также читать "
One quick fix available: Remove @Override annotation.
"Это было на Eclipse 4.6.3, JDK 1.8.0_144.
источник
Если класс, который реализует,
interface
являетсяabstract
классом,@Override
полезно убедиться, что реализация предназначена дляinterface
метода; без класса просто компилироваться даже если метод реализации подпись не соответствует методу объявлена в ; несоответствующий метод останется нереализованным. Документ Java, цитируемый @Zhao@Override
abstract
interface
interface
явно относится к
abstract
суперклассу; Анinterface
нельзя назвать супертипом. Таким образом,@Override
является избыточным и не имеет смысла дляinterface
реализации методов в конкретных классах.источник