Nous avons des tests unitaires qui compilent et font fonctionner correctement à Eclipse 3.4, mais lorsque nous essayons de les compiler à l'aide de Javac, il échoue. J'ai réussi à réduire le code à quelque chose de petit et autonome, il n'a donc aucune dépendance externe. Le code lui-même n'aura pas beaucoup de sens parce que tout est hors de contexte, mais cela n'a pas d'importance - j'ai juste besoin de savoir pourquoi Javac n'aime pas ceci: I ' ve essayé avec Je pense que c'est Java parfaitement valide. Le sous-militant.WITH () méthode renvoie un type plus spécifique que Basematcher.with (), mais le compilateur semble penser que le type de retour est basumé. Cependant, il est possible que le compilateur Eclipse autorise incorrectement quelque chose qu'il ne devrait pas être. P> Des idées? P> P> jdk 1.5.0_10 code> et
1.6.0_13 code>, avec le même résultat: p>
4 Réponses :
Vérifiez que JRE ou JDK vous compilez avec Eclipse et Terminal. Peut-être que c'est peut-être la question de la version. P>
Eclipse utilise le 1,5,0_10 JRE, la même chose que le Javac que j'essaie.
Eclipse a son propre compilateur, c'est-à-dire qu'il n'utilise pas Javac
in Basematcher, vous devez spécifier les paramètres de type: Pour permettre à Javac correspond à votre PS p> IMHO est un bug du compilateur Eclipse P> P> avec code> méthode p>
Vous-même et Greg ont tous deux obtenu la réponse, mais je dois donner le prix à quelqu'un et vous étiez légèrement plus rapide ...
fonctionne pour moi:
$ java -version openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-****-2009_07_23_10_21-b00) OpenJDK 64-Bit Server VM (build 16.0-b06, mixed mode) $ javac -XDrawDiagnostics Test.java $
Je l'ai fait construire avec succès en ajoutant ,?> code> à
correspondant code> dans
sousmatterie.avith code>:
class SubMatcher extends BaseMatcher {
@Override
public SubMatcher with(Matcher<?,?> matcher) {
return this;
}
}
C'est une situation intéressante. Vous pouvez faire valoir que Javac est en faute ici, car il est permis d'annotation @override, mais il utilise ensuite la méthode de la sous-classe plutôt que la nervure. Ceci est incompatible, l'annotation est là pour empêcher ce type de problème. La question est de savoir si une méthode avec un paramètre de type brut peut remplacer une méthode de superclasse avec le même type avec >
Je peux reproduire cette erreur de compilateur avec JDK 1.6 sur Linux. On dirait que les types de retour de covariant introduit avec Java 1.5 ne fonctionnent pas correctement dans cet exemple.