55 votes

Pourquoi javac échoue-t-il dans l'annotation @Override?

Eclipse ajoute des annotations @Override lorsque j'implémente les méthodes d'une interface. Eclipse ne semble pas avoir de problème avec ça. Et notre processus de construction automatisé de Cruise Control ne semble pas avoir de problème avec cela. Mais lorsque je construis à 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. Le régulateur de vitesse fonctionne sous Java 1.5. Ma compilation ant échoue, quelle que soit la version de Java que j'utilise.

101voto

Joshua McKinnon Points 12379

Le @Override annotation spec changé dans la version 1.6 de Java. Dans Java 1.5, le compilateur ne permettent pas l' @Override annotation sur la mise en œuvre de méthodes d'interface, mais en 1.6, il n'. Premier résultat de recherche, j'ai trouvé un billet de blog ici.. Il n'a pas été bien documenté, mais il n'a changer.

Eclipse est de l'ajouter parce que votre Eclipse est réglé pour le 1.6 conformité...vous devriez essayer de garder votre construction et environnements eclipse sur la même version de Java. Il est clair pour moi par votre spécifiant le régulateur de vitesse est en cours d'exécution Java 5 sur si oui ou non il est en train de compiler en utilisant un JDK6 ou pas.

Séparé de la au-dessus de 1,5 vs 1.6 @Override annotation règles, n'oubliez pas que Eclipse dispose de son propre compilateur de mise en œuvre (pas de javac) et parfois avoir des comportements différents. Chaque fois que quelque chose compile dans Eclipse, mais pas Ant ou Maven, vous aurez besoin de trouver un moyen de faire les deux compilateurs heureux.

Here's a screenshot of changing the compiler in eclipse

16voto

Martin Points 13951

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

JDK 6 autorisera @Override sur aucun d’entre eux.

Si votre compilation ant échoue, il se peut que vous transmettiez un paramètre source à javac, vous demandant de vous conformer à la norme JDK 5.

3voto

ChrisH Points 3447

Les balises @Override pour les méthodes implémentées sont nouvelles pour Java 1.6. En Java 1.5, @Override n'est correct que lors du remplacement d'une méthode dans une classe de base. Lire la suite ici et ici .

3voto

matthieus Points 133

La réponse directe à la question "Pourquoi" une erreur est générée par javac quand @Override est utilisé dans le contexte d'une méthode mise en œuvre est en fait dans les spécifications java:

"La raison pour cela est qu'un béton de classe qui implémente une interface doit nécessairement remplacer toutes les interface des méthodes, indépendamment de l' @Override annotation, et donc il serait difficile d'avoir de la sémantique de cette annotation interagir avec les règles de la mise en œuvre 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...

1voto

Glenn Yu Points 169

Beaucoup de gens, y compris moi, se sont fait avoir. Voir ici pour une plus grande discussion SO

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