7
votes

Pourquoi Eclipse compile-t-elle cela, mais Javac ne le fait pas?

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: XXX

I ' ve essayé avec jdk 1.5.0_10 et 1.6.0_13 , avec le même résultat: xxx

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.

Des idées?


1 commentaires

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.


4 Réponses :


0
votes

Vérifiez que JRE ou JDK vous compilez avec Eclipse et Terminal. Peut-être que c'est peut-être la question de la version.


2 commentaires

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



7
votes

in Basematcher, vous devez spécifier les paramètres de type: xxx

Pour permettre à Javac correspond à votre avec méthode

PS

IMHO est un bug du compilateur Eclipse


1 commentaires

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 ...



0
votes

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 
$


0 commentaires

6
votes

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;
    }
}


1 commentaires

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