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

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

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

указывает, что объявление метода предназначено для переопределения объявления метода в суперклассе. Если метод аннотируется этим типом аннотации, но не переопределяет метод суперкласса, компиляторы необходимы для создания сообщения об ошибке.

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

Разработка Вопрос

14 ответов


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

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

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

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


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


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

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

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

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

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

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


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


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


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


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


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


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


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


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


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

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

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


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

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

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

Итак, по крайней мере, в 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.