2010-12-01 4 views
4

J'essaye de faire échouer ma construction java quand j'ai une classe qui remplace une méthode de super-classe sans spécifier l'annotation @Override.javac -Xlint: overrides ne fonctionne pas

La construction est fait par des fourmis, et je l'ai ajouté les éléments suivants à ma tâche <javac>:

<compilerarg value="-Werror"/> 
<compilerarg value="-Xlint:unchecked,overrides"/> 

L'option unchecked est suivie, mais l'option overrides est ignorée. J'ai également essayé de séparer les deux options Xlint en deux éléments distincts <compilerarg>, en vain. Est-ce que je me méprends sur ce que cette option fait?

Une note: c'est JDK6 sur MacOSX (10.6). Pourrais-je être confronté à un bug spécifique à OSX?

+0

fonctionne très bien sur ma machine OS X. J'ai testé avec l'exemple de remplacement ici: http://www.javaworld.com/community/node/5276 javac 1.6.0_22 –

+0

Si vous utilisez IntelliJ IDEA il a une inspection pour faire exactement cela, mais il n'est pas activé par défaut , vous pouvez accéder aux paramètres> inspections> Annotation de remplacement manquant –

Répondre

4

Je crois que vous ne comprenez pas le comportement Xlint:overrides. A ma connaissance, l'activation de cette vérification entraînera l'émission par le compilateur d'avertissements (ou peut-être d'erreurs) lorsqu'il rencontrera une méthode annotée avec @Override qui ne remplacera pas réellement une méthode de super-classe. Cependant, il ne vérifie pas que toutes les méthodes surchargées sont correctement annotées.

EDIT: Juste testé. Le compilateur émet une erreur lorsque vous spécifiez @Override sur une méthode qui ne remplace pas une méthode de super-classe, avec ou sans l'option Xlint.

La documentation sur Oracle's website ne mentionne même pas l'option Xlint: overrides, donc je suppose qu'elle n'est pas implémentée.

+0

Merci, cela répond à cette question. Maintenant, j'ai juste besoin de comprendre comment faire échouer mon build quand @Override est absent sur une méthode surchargée ... –

+0

Je crois qu'il pourrait être possible de dire à Findbugs ou Checkstyle d'échouer sur ce genre d'erreur ... Je ne fais que vaguement rappelez-vous, donc je peux me tromper. Il y a forcément un outil quelque part qui le fait :) –

+0

@CameronSkinner Je viens de regarder Findbugs et Checkstyle et ni l'un ni l'autre n'avait une telle vérification. Checkstyle a une vérification MissingOverride mais uniquement "Vérifie que l'annotation java.lang.Override est présente lorsque la balise {@inheritDoc} javadoc est présente", donc cela ne fonctionne pas si vous avez oublié la documentation aussi. – Eponymous

0

Xlint: overrides est plus subtil que @Override. @Override (comme le souligne Cameron Skinner) provoquera une erreur du compilateur s'il annote une méthode qui ne remplace pas une autre méthode. L'option Xlint: overrides, cependant, produit un avertissement si l'on a marqué une méthode avec un paramètre varargs pour remplacer une autre qui n'a pas de paramètre varargs mais utilise plutôt un tableau. Une bonne explication se trouve ici:

http://marxsoftware.blogspot.com/2010/10/javacs-xlint-options.html