Должны ли мы @Override реализации метода интерфейса? - PullRequest
403 голосов
/ 17 октября 2008

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

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

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

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

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

Ответы [ 15 ]

1 голос
/ 28 сентября 2016

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

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

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

1 голос
/ 20 марта 2014

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

1 голос
/ 18 октября 2008

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

0 голосов
/ 02 февраля 2019

Если класс, реализующий interface, является классом abstract, @Override полезен для гарантии того, что реализация предназначена для метода interface; без @Override класс abstract просто скомпилируется нормально, даже если сигнатура метода реализации не соответствует методу, объявленному в interface; несоответствующий метод interface останется нереализованным. Документ Java, цитируемый @ Zhao

Метод переопределяет или реализует метод, объявленный в супертипе

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

0 голосов
/ 12 мая 2018

Для интерфейса использование @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.

...