Должны ли мы @Override реализации метода интерфейса?

Следует ли аннотировать метод, реализующий метод интерфейса, с помощью @Override?

javadoc аннотации Override говорит:

Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.

Я не думаю, что интерфейс технически является суперклассом. Либо это?

Question Elaboration

Я не могу найти замену статье @Override (Oracle недавно перенес старые блоги Sun). Вы знаете, как его найти?

Bill the Lizard 26.07.2012 19:24

К настоящему времени (2015 г.) у нас должна быть аннотация @Implement (s). Это прояснит ситуацию!

Alex 19.02.2015 11:58

к настоящему времени (2015 г.) должны ли мы использовать @Override с java 8?

Lorenzo Sciuto 15.06.2015 17:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
446
3
178 126
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Ответ принят как подходящий

По возможности следует использовать @Override. Это предотвращает совершение простых ошибок. Пример:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

Это не компилируется, потому что оно неправильно переопределяет public boolean equals(Object obj).

То же самое касается методов, реализующих интерфейс (Только 1.6 и выше) или переопределяющих метод суперкласса.

Обратите внимание, что вы не могу добавляете аннотацию @Override к методу, реализующему интерфейс в Java 5 - это генерирует ошибку. Это разрешено в Java 6.

Bill Michell 22.10.2008 13:39

Гм, нет, это не так. Фактически, Eclipse автоматически вставляет @Override при заполнении методов, реализующих интерфейс.

jjnguy 15.01.2010 20:26

-1, пока в ответе не будет упоминания о различном поведении от Java 1.5 до 1.6 в отношении реализации метода интерфейса. Просто потому, что я видел, что это сбивает с толку людей и действительно заслуживает упоминания.

Grundlefleck 15.01.2010 20:32

Исправлено ... Думаю, все используют последнюю версию Java. Виноват.

jjnguy 15.01.2010 20:35

+1 для после 1,5 бит. Мне потребовалось 20 минут, чтобы понять, почему eclipse выдает ошибки, и с этим я понял, что мой новый проект использует java 1.5.

grinch 08.10.2012 07:57

Если eclipse жалуется, обновите ur jdk до> 1.5 и измените уровень соответствия компилятора на 1.6 или 1.7. Для этого щелкните правой кнопкой мыши ur project-> properties-> Java compiler и выберите тот, который выше 1.5.

Rose 14.11.2012 23:18

Может ли кто-нибудь придумать пример, который действительно оправдывает ответ (реализация интерфейсов, а не переопределение базовых методов)? Большим плюсом для меня является то, что он помогает сформировать у читателей ожидания относительно того, как и каким образом можно использовать тот или иной метод.

Joe Lee-Moyet 27.05.2014 21:13

Eclipse не допускает обозначение @Override для методов, которые не наследуются суперклассом.

Luca Marzi 11.06.2015 15:39

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

dtc 10.05.2016 01:59

Это не ответ на вопрос. Объект - это не интерфейс.

user1944408 18.07.2016 19:36

Хотя это приветствуется, аннотации не являются обязательными. Это метаданные!

NoName 24.06.2017 17:38

@NoName Если вы поместите аннотацию «Переопределить» на что-то, что не отменяется, это не будет построено. Вот что говорит этот ответ. Таким образом, вы убедитесь, что действительно переопределяете метод, а не создаете новый, если вы неправильно написали имя метода или что-то в этом роде.

Jean-François Beauchef 14.05.2020 21:14

Я бы использовал его при любой возможности. См. Когда вы используете аннотацию Java @Override и почему?

Я считаю, что поведение javac изменилось - с 1.5 он запретил аннотацию, с 1.6 нет. Аннотация обеспечивает дополнительную проверку во время компиляции, поэтому, если вы используете 1.6, я бы пошел на это.

@Michael Вы можете заметить, был ли удален какой-либо интерфейс.

Sanghyun Lee 27.02.2012 04:26

Переопределение ваших собственных методов, унаследованных от ваших собственных классов, обычно не нарушает рефакторинга с использованием ide. Но если вы переопределяете метод, унаследованный от библиотеки, рекомендуется использовать его. Если вы этого не сделаете, вы часто получите не ошибку при последующем изменении библиотеки, а хорошо скрытую ошибку.

Eclipse сам добавит аннотацию @Override, когда вы скажете ему «сгенерировать нереализованные методы» во время создания класса, реализующего интерфейс.

Для меня часто это единственная причина, по которой некоторый код требует компиляции Java 6. Не уверен, стоит ли оно того.

JDK 5.0 не позволяет использовать аннотацию @Override, если вы реализуете метод, объявленный в интерфейсе (его ошибка компиляции), но JDK 6.0 позволяет это. Так что, возможно, вы можете настроить предпочтения вашего проекта в соответствии с вашими требованиями.

С JDK это не проблема. В Eclipse Helios он разрешает аннотацию @Override для реализованных методов интерфейса, в зависимости от того, какой JDK 5 или 6. Что касается Eclipse Galileo, аннотация @Override не разрешена, в зависимости от того, какой JDK 5 или 6.

Вы всегда должны аннотировать методы с помощью @Override, если он доступен.

В JDK 5 это означает переопределение методов суперклассов, в JDK 6 и 7 это означает переопределение методов суперклассов и реализацию методов интерфейсов. Причина, как упоминалось ранее, заключается в том, что это позволяет компилятору обнаруживать ошибки, когда вы думаете, что переопределяете (или реализуете) метод, но на самом деле определяете новый метод (другую сигнатуру).

Пример equals(Object) и equals(YourObject) является стандартным случаем, но тот же аргумент можно привести для реализации интерфейсов.

Я предполагаю, что не обязательно аннотировать методы реализации интерфейсов, потому что JDK 5 пометил это как ошибку компиляции. Если JDK 6 сделает эту аннотацию обязательной, это нарушит обратную совместимость.

Я не являюсь пользователем Eclipse, но в других IDE (IntelliJ) аннотация @Override добавляется только при реализации методов интерфейса, если проект задан как проект JDK 6+. Я бы предположил, что Eclipse похож.

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

Проблема с включением @Override заключается в том, что вы думаете, что вы забыли вызвать метод super.theOverridenMethod(), то есть очень запутанный. Это должно быть предельно ясно. Возможно, Java следует предложить здесь @Interface. Да ладно, еще одна недооцененная особенность Java ...

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

lilbyrdie 03.06.2014 19:19

Если класс конкретный не является абстрактным методом преобладающий, использование @Override для выполнение является открытым вопросом, поскольку компилятор всегда предупреждает вас о любых нереализованных методах. В этих случаях можно привести аргумент, что это снижает удобочитаемость - в вашем коде больше вещей, которые нужно читать, и, в меньшей степени, он называется @Override, а не @Implement.

В java 6 и более поздних версиях вы можете использовать @Override для метода, реализующего интерфейс.

Но я не думаю, что это имеет смысл: переопределение означает, что у вас есть метод в суперклассе, и вы реализуете его в подклассе.

Если вы реализуете интерфейс, я думаю, нам следует использовать @Implement или что-то еще, но не @Override.

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

cnexans 27.08.2020 08:26

Читая javadoc в java8, вы можете найти следующее в объявлении переопределения интерфейса:

Если метод аннотирован этим типом аннотации, компиляторы должны генерировать сообщение об ошибке, если не выполняется хотя бы одно из следующих условий:

  • Метод переопределяет или реализует метод, объявленный в супертипе.
  • Этот метод имеет сигнатуру, эквивалентную сигнатуре любого общедоступного метода, объявленного в {@linkplain Object}.

Итак, по крайней мере, в java8 вы должны использовать @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; без @Override класс abstract просто компилируется нормально, даже если сигнатура метода реализации не соответствует методу, объявленному в interface; несовпадающий метод interface останется нереализованным. Документ Java, цитируемый @Zhao

The method does override or implement a method declared in a supertype

явно относится к суперклассу abstract; interface нельзя назвать супертипом. Итак, @Override избыточен и не подходит для реализации метода interface в конкретных классах.

Другие вопросы по теме