web-dev-qa-db-fra.com

Pourquoi javac échoue sur l'annotation @Override

Eclipse ajoute des annotations @Override lorsque j'implémente des méthodes d'une interface. Eclipse ne semble avoir aucun problème avec cela. Et notre processus de construction automatisé de Cruise Control ne semble pas avoir de problème avec cela. Mais lorsque je crée à partir de la ligne de commande, avec ant exécutant javac, j'obtiens cette erreur:

[javac] C:\path\project\src\com\us\MyClass.Java:70: method does not override a method from its superclass
[javac]     @Override
[javac]      ^
[javac] 1 error

Eclipse fonctionne sous Java 1.6. Cruise Control est en cours d'exécution Java 1.5. Ma génération de fourmis échoue quelle que soit la version de Java = J'utilise.

53
skiphoppy

Le @Override la spécification d'annotation a changé en Java 1.6. Dans Java 1.5, le compilateur n'a pas autorisé le @Override annotation sur les méthodes d'interface implémentées, mais en 1.6 c'est le cas. Le premier résultat de recherche que j'ai trouvé est un article de blog ici. . Cela n'était pas bien documenté , mais cela a changé.

Eclipse l'ajoute car votre Eclipse est définie pour la conformité 1.6. Vous devez essayer de conserver vos environnements de génération et Eclipse sur la même version de Java. Il n'est pas clair pour moi que vous spécifiez que le régulateur de vitesse fonctionne Java 5 pour savoir s'il compile ou non à l'aide d'un JDK6 distinct.

Séparé de ce qui précède 1,5 vs 1,6 @Override règles d'annotation, souvenez-vous qu'Eclipse a sa propre implémentation du compilateur (pas javac) et aura parfois un comportement différent. Chaque fois que quelque chose se compile dans Eclipse, mais pas Ant ou Maven, vous devrez trouver un moyen de rendre les deux compilateurs heureux.

Here's a screenshot of changing the compiler in Eclipse

99
Joshua McKinnon

Je ne peux pas vraiment expliquer le problème que vous voyez, mais il semble être lié au fait que JDK 5 ne permettra pas @Override sur les méthodes implémentées d'une interface, uniquement sur les méthodes surchargées présentes dans une super classe.

JDK 6 permettra @Override sur l'un d'eux.

Si votre génération de fourmis échoue, il se peut qu'il passe un paramètre source à javac, demandant la conformité JDK 5.

16
Martin

La réponse directe à la question "Pourquoi" une erreur est soulevée par javac lorsque @Override est utilisé dans le contexte d'une implémentation de méthode se trouve en fait dans les spécifications Java:

"La raison en est qu'une classe concrète qui implémente une interface va forcément remplacer toutes les méthodes de l'interface indépendamment de l'annotation @Override, et il serait donc déroutant d'avoir la sémantique de cette annotation interagir avec les règles d'implémentation des interfaces. "

Voir http://Java.Sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4

Mais apparemment, quelqu'un a changé d'avis pour Java 1.6 et 1.5 u21 ...

3
matthieus

@Override les balises des méthodes implémentées sont nouvelles pour Java 1.6. Dans Java 1.5 @Override n'est correct que lors de la substitution d'une méthode dans une classe de base. En savoir plus ici et ici .

3
ChrisH

Beaucoup de gens, y compris moi, ont été cassés par cela. Voir ici pour une plus grande SO

1
Glenn Yu

Assurez-vous qu'il n'y a qu'une seule définition de cette interface.

Exemple: HttpServletRequest

Il s'agit d'une interface avec des spécifications différentes selon le fournisseur.

Comparez pax-web-jetty et Apache-felix-jetty. Ils ont différentes méthodes.

0
M.Kosmal

Eclipse pointerait vers la version 1.6 de Java plutôt que 1.5. voir ici pour configurer Java version dans Eclipse).

0
Jishnu

J'ai eu le même problème lors de la construction d'un projet avec ANT. La solution au problème était de modifier la propriété suivante dans le fichier build.properties:

javac.compiler=org.Eclipse.jdt.core.JDTCompilerAdapter

à:

javac.compiler=modern

Cela a résolu le problème et le projet a été compilé et déployé avec succès.

0
Torsten Barthel