Question

Nous avons quelques tests unitaires qui compilent et fonctionnent très bien dans Eclipse 3.4, mais quand nous essayons de les compiler en utilisant javac, il tombe en panne. J'ai réussi à couper le code à quelque chose de petit et autonome, il n'a pas de dépendances externes. Le code lui-même ne sera pas beaucoup de sens parce que tout est hors contexte, mais cela n'a pas d'importance - je dois juste savoir pourquoi javac n'aime pas:

public class Test {

    public void test() {
        matchOn(someMatcher().with(anotherMatcher()));
    }

    void matchOn(SubMatcher matcher) {}

    SubMatcher someMatcher() {
        return new SubMatcher();
    }

    Matcher anotherMatcher() {
        return null;
    }
}

interface Matcher <U, T> {}

class BaseMatcher implements Matcher {
    public BaseMatcher with(Matcher<?,?> matcher) {
        return this;
    }
}

class SubMatcher extends BaseMatcher {
    @Override
    public SubMatcher with(Matcher matcher) {
        return this;
    }
}

Je l'ai essayé avec JDK 1.5.0_10 et 1.6.0_13, avec le même résultat:

Test.java:6: matchOn(test.SubMatcher) in test.Test cannot be applied to (test.BaseMatcher)
                matchOn(someMatcher().with(anotherMatcher()));
                ^
1 error

Je pense que cela est parfaitement valide Java. La méthode SubMatcher.with () retourne un type plus spécifique que BaseMatcher.with (), mais le compilateur semble penser que le type de retour est BaseMatcher. Cependant, il est possible que le compilateur Eclipse permet à tort quelque chose qu'il ne devrait pas être.

Toutes les idées?

Était-ce utile?

La solution

BaseMatcher vous devez spécifier des paramètres de type:

public SubMatcher with(Matcher<?, ?> matcher) {

afin de permettre javac pour correspondre à votre méthode with

PS

IMHO est un bug du compilateur éclipse

Autres conseils

Je l'ai fait construire avec succès en ajoutant à <?,?> Matcher dans SubMatcher.with:

class SubMatcher extends BaseMatcher {
    @Override
    public SubMatcher with(Matcher<?,?> matcher) {
        return this;
    }
}

Sans cela, la signature de la méthode est différente de la base. Je me demande s'il y a un bogue dans le contrôle de @Override qui ne parvient pas à le remarquer.

Vérifiez que jre ou Jdk vous compilez avec à la fois sur Eclipse et le terminal. Peut-être qu'il pourrait être la question de version.

Travaux 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 me souviens vaguement un tel bugreport, mais ne peut pas vous donner un lien vers ce moment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top