473 votes

Une méthode qui implémente une méthode d’interface doit être annotée avec @Override

Intro

Ma vraie question est à propos de l'utilisation de l'annotation. En essayant de trouver la réponse moi-même, j'ai couru dans plusieurs autres questions. C'est pourquoi il y a aussi des questions liées à ci-dessous. J'espère que ce n'est pas trop confus.

Question

Si une méthode qui implémente une interface de la méthode annotée avec l' @Override? Eclipse par exemple insère automatiquement un @Override d'annotation après l'utilisation de la solution Rapide à l'option 'Ajouter, mis en oeuvre méthodes". Est-ce comportement correct?

La javadoc de l' Override d'annotation dit:

Indique qu'une déclaration de méthode est destinée à remplacer une déclaration de méthode dans une super-classe. Si une méthode est annoté avec ce type d'annotation, mais ne remplace pas une super-classe de la méthode, les compilateurs sont nécessaires pour générer un message d'erreur.

Je ne pense pas qu'une interface est techniquement une super-classe. Ou est-il? Les compilateurs ne génère pas une erreur, au moins lorsque l'annotation est utilisée dans ce cas.

Eclipse peut donner des avertissements si vous omettez cette annotation pour remplacer les "vrais" super-classe de méthodes. Il n'est pas si vous l'omettez, pour les méthodes d'interface. Une autre question a révélé que c'est un glitch dans Eclipse.

La raison de ce qui m'inquiète un peu, c'est que j'essaie d'être cohérent. Mais si l'IDE n'est pas de donner des avertissements lors de l'annotation n'est pas là et génère automatiquement sur l'autre main, la consistance est plutôt difficile.

Edit: Deux articles info: @Override et @Override Snafu

335voto

jjnguy Points 62123

Vous devez utiliser @Override lorsque cela est possible. Il empêche les erreurs simples soient versées. Exemple :

Cela ne compile pas parce qu’il n’est pas correctement substituer equals.

Les mêmes ira pour les méthodes qui implémentent une interface (1,6 et surtout seul) ou substituent la méthode de la classe Super.

117voto

Jon Skeet Points 692016

Je crois que javac comportement a changé - avec 1.5 qu'il interdit l’annotation, avec 1.6 qu'il ne marche pas. L’annotation fournit une vérification supplémentaire compilation, donc si vous utilisez 1.6 j’aller pour elle.

80voto

GKelly Points 1394

Vous devriez toujours annoter des méthodes avec des @Override si elle est disponible.

Dans le JDK 5, cela signifie redéfinition des méthodes de super-classes, dans le JDK 6, et 7, les moyens de substitution des méthodes de super-classes, et les méthodes de mise en œuvre d'interfaces. La raison, comme mentionné précédemment, est qu'il permet le compilor d'intercepter les erreurs où vous pensez que vous êtes primordial (ou d'exécution) d'une méthode, mais sont en fait la définition d'une nouvelle méthode (signature différente).

L' equals(Object) vs equals(YourObject) exemple est un cas standard point, mais le même argument peut être faite pour les implémentations d'interface.

J'imagine que la raison pour laquelle il n'est pas obligatoire pour annoter les méthodes de mise en œuvre des interfaces de JDK 5 marqué ceci comme une erreur de compilation. Si le JDK 6, a cette annotation obligatoire, il allait se casser la compatibilité ascendante.

Je ne suis pas un utilisateur d'Eclipse, mais dans d'autres environnements de développement intégrés (Ide), l' @Override d'annotation n'est ajouté lors de la mise en œuvre des méthodes d'interface, si le projet est défini comme un JDK 6+ projet. J'imagine que Eclipse est similaire.

Cependant, j'aurais préféré voir une autre annotation pour cet usage, peut-être un @Implements d'annotation.

17voto

Alex B Points 12826

Je voudrais l’utiliser à chaque occasion. Voir quand utilisez-vous annotation @Override de Java et pourquoi ?

11voto

Silent Warrior Points 1209

JDK 5.0 ne permet pas d’utiliser l’annotation @Override si vous implémentez méthode déclarée dans l’interface (son erreur de compilation), mais le JDK 6.0 permet même. Alors peut être vous pouvez configurer vos préférences de projet selon votre condition.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X