Question

Une méthode qui implémente une méthode d'interface doit-elle être annotée avec @Override ?

Le javadoc du Remplacer annotation dit:

  

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

Je ne pense pas qu'une interface est techniquement une super-classe. Ou est-ce?

Élaboration de questions

Était-ce utile?

La solution

Vous devez utiliser @Override autant que possible. Cela évite les erreurs simples. Exemple:

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

Cela ne compile pas car il ne remplace pas correctement public booléen est égal à (Object obj) .

Il en va de même pour les méthodes qui implémentent une interface ( 1.6 et versions supérieures uniquement ) ou qui remplacent la méthode d'une classe Super.

Autres conseils

Je pense que le comportement de javac a changé: avec 1.5, il interdisait l'annotation, avec 1.6, ce n'était pas le cas. L'annotation fournit une vérification supplémentaire au moment de la compilation, donc si vous utilisez la version 1.6, je l'essaierai.

Vous devriez toujours annoter les méthodes avec @Override si elles sont disponibles.

Dans JDK 5, cela signifie les méthodes de substitution des superclasses, tandis que dans les JDK 6 et 7, cela signifie des méthodes de substitution des superclasses et la mise en œuvre de méthodes d’interface. La raison, comme mentionné précédemment, est que cela permet au compilateur d'attraper les erreurs lorsque vous pensez que vous substituez (ou implémentez) une méthode, mais définissez en réalité une nouvelle méthode (signature différente).

L'exemple égal à (Object) par rapport à égal à (YourObject) est un exemple typique, mais le même argument peut être avancé pour les implémentations d'interface.

J'imagine que la raison pour laquelle il n'est pas obligatoire d'annoter les méthodes d'implémentation des interfaces est que JDK 5 l'a signalé comme une erreur de compilation. Si JDK 6 rend cette annotation obligatoire, la compatibilité avec les versions antérieures sera rompue.

Je ne suis pas un utilisateur Eclipse, mais dans d'autres IDE (IntelliJ), l'annotation @Override est ajoutée uniquement lors de l'implémentation de méthodes d'interface si le projet est défini en tant que projet JDK 6+. J'imagine qu'Eclipse est similaire.

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

Je l’utiliserais à chaque occasion. Voir Quand utilisez-vous l'annotation @Override de Java et pourquoi?

JDK 5.0 ne vous permet pas d'utiliser l'annotation @Override si vous implémentez une méthode déclarée dans l'interface (son erreur de compilation), mais JDK 6.0 le permet. Ainsi, vous pourrez peut-être configurer vos préférences de projet en fonction de vos besoins.

Remplacer vos propres méthodes héritées de vos propres classes ne sera généralement pas interrompu lors de la refactorisation à l'aide d'un ide. Mais si vous substituez une méthode héritée d'une bibliothèque, il est recommandé de l'utiliser. Sinon, vous n'obtiendrez souvent aucune erreur lors d'un changement de bibliothèque ultérieur, mais un bogue bien caché.

Ce n'est pas un problème avec JDK. Dans Eclipse Helios, il permet l’annotation @Override pour les méthodes d’interface implémentées, quel que soit le kit JDK 5 ou 6. Pour Eclipse Galileo, l’annotation @Override n’est pas autorisée, quel que soit le kit JDK 5 ou 6.

Si une classe béton n'est pas substituant une méthode abstraite, l'utilisation de @Override pour l'implémentation est une méthode ouverte. le compilateur vous avertira invariablement de toute méthode non implémentée. Dans ces cas, on peut argumenter que cela nuit à la lisibilité: il s'agit de choses à lire sur votre code et, dans une moindre mesure, il s'appelle @Override et non @. Implémenter .

Pour moi, c'est souvent la seule raison pour laquelle un code nécessite la compilation de Java 6. Pas sûr que ça en vaille la peine.

Eclipse lui-même ajoutera l'annotation @Override lorsque vous lui direz de "générer des méthodes non implémentées". lors de la création d'une classe qui implémente une interface.

Le problème avec l'inclusion de @Override est que cela vous fait penser que vous avez oublié d'appeler la méthode super.theOverridenMethod () , ce qui est très déroutant. . Cela devrait être limpide. Peut-être que Java devrait proposer un @Interface à utiliser ici. Eh bien, encore une autre particularité de Java à moitié nulle ...

Dans java 6 et les versions ultérieures, vous pouvez utiliser @Override pour une méthode mettant en oeuvre une interface.

Mais, je ne pense pas que cela ait du sens: override signifie que vous avez une méthode dans la super-classe et que vous l'implémentez dans la sous-classe.

Si vous implémentez une interface, je pense que nous devrions utiliser @Implement ou quelque chose d'autre, mais pas le @Override .

En lisant le javadoc dans java8, vous pouvez trouver ce qui suit dans la déclaration d’interface Remplacer:

Si une méthode est annotée avec cette annotation, les compilateurs doivent générer un message d'erreur, sauf si l'une au moins des conditions suivantes est remplie:

  • La méthode remplace ou implémente une méthode déclarée dans un supertype.
  • La méthode a une signature qui est équivalente à celle d'une méthode publique déclarée dans {@linkplain Object}.

Donc, au moins en java8, vous devez utiliser @Override sur une implémentation d'une méthode d'interface.

Pour l'interface, l'utilisation de @Override a provoqué une erreur de compilation. Donc, je devais l'enlever.

Message d'erreur renvoyé " La méthode getAllProducts () de type InMemoryProductRepository doit remplacer une méthode de superclasse ".

Il lit également " une solution rapide disponible: supprimez l'annotation @Override. "

.

C'était sur Eclipse 4.6.3, JDK 1.8.0_144.

Si la classe qui implémente l'interface est une classe abstraite , @Override est utile pour garantir que l'implémentation concerne un élément < méthode code> interface ; sans le @Override , une classe abstract serait simplement compilée correctement même si la signature de la méthode d'implémentation ne correspond pas à la méthode déclarée dans interface ; la méthode interface incompatible devrait rester non implémentée. Le document Java cité par @Zhao

  

La méthode remplace ou implémente une méthode déclarée dans un supertype

fait clairement référence à une super classe abstract ; un interface ne peut pas être appelé le supertype. Ainsi, @Override est redondant et peu judicieux pour les implémentations de méthodes interface dans des classes concrètes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top