Pourquoi javac échoue-t-il sur les annotations @Override?

Eclipse ajoute des annotations @Override lorsque j’implémente des méthodes d’une interface. Eclipse ne semble pas avoir de problème avec cela. Et notre processus de génération automatisé de Cruise Control ne semble pas avoir de problème avec cela. Mais quand je construis à partir de la ligne de commande, avec ant en cours d’exécution 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 s’exécute sous Java 1.6. Cruise Control exécute Java 1.5. Ma compilation ant échoue quelle que soit la version de Java que j’utilise.

La spécification d’annotation @Override a été modifiée dans Java 1.6. Dans Java 1.5, le compilateur n’autorisait pas l’annotation @Override sur les méthodes d’interface implémentées, mais le 1.6 le faisait. Le premier résultat de recherche que j’ai trouvé est un article de blog ici. . Ce n’était pas bien documenté , mais cela a changé.

Eclipse l’ajoute parce que votre Eclipse est configuré pour la conformité avec la norme 1.6 … vous devriez essayer de garder vos environnements de compilation et d’éclipse sur la même version de Java. Il ne me semble pas clair que vous spécifiez que Cruise Control exécute Java 5 pour savoir s’il comstack ou non à l’aide d’un JDK6 distinct.

Séparé des règles d’annotation @Override de 1,5 vs 1,6 ci-dessus, rappelez-vous qu’Eclipse a sa propre implémentation de compilateur (pas javac) et que son comportement sera parfois différent. Chaque fois que quelque chose comstack dans Eclipse, mais pas dans Ant ou Maven, vous devrez trouver un moyen de rendre les deux compilateurs heureux.

Voici une capture d'écran de la modification du compilateur dans eclipse

Je ne peux pas vraiment expliquer le problème que vous voyez, mais cela semble être lié au fait que JDK 5 ne permettra pas à @Override d’appliquer les méthodes d’une interface , mais uniquement aux méthodes surchargées présentes dans une super-classe .

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

Si votre compilation ant échoue, il peut passer un paramètre source à javac, demandant la conformité JDK 5.

Les balises @Override pour les 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. Lisez plus ici et ici .

La réponse directe à la question “Pourquoi” une erreur est générée par javac lorsque @Override est utilisé dans le contexte d’une implémentation de méthode est en fait dans les spécifications Java:

“La raison en est qu’une classe concrète qui implémente une interface remplacera nécessairement toutes les méthodes de l’interface, indépendamment de l’annotation @Override. Il serait donc déroutant d’avoir une sémantique de cette annotation en interaction 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 …

Beaucoup de gens, y compris moi-même, ont été victimes de cela. Voir ici pour une plus grande discussion SO

Eclipse indiquerait la version 1.6 de Java plutôt que la version 1.5. Voir ici pour configurer la version Java en éclipse.

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

Exemple: HttpServletRequest

Ceci est une interface avec différentes spécifications selon le fournisseur.

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

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

 javac.comstackr=org.eclipse.jdt.core.JDTComstackrAdapter 

à:

 javac.comstackr=modern 

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