Frage

Wir haben einige Tests Einheit, die kompiliert und ausgeführt werden fein in Eclipse 3.4, aber wenn wir versuchen, sie zu kompilieren javac verwenden, es funktioniert nicht. Ich habe es geschafft, den Code unten zu etwas klein und umluftunabhängigem zu schneiden, so hat es keine externen Abhängigkeiten. Der Code selbst wird nicht viel Sinn machen, weil es alles aus dem Zusammenhang gerissen ist, aber das macht nichts - ich muss nur herausfinden, warum Javac dies nicht mögen:

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

Ich habe versucht, mit JDK 1.5.0_10 und 1.6.0_13, mit dem gleichen Ergebnis:

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

Ich denke, das absolut gültiges Java ist. Die SubMatcher.with () Methode gibt einen spezifischeren Typ als BaseMatcher.with (), aber der Compiler scheint zu glauben, dass der Rückgabetyp ist BaseMatcher. Es ist jedoch möglich, dass der Eclipse-Compiler falsch etwas erlaubt es soll nicht sein.

Irgendwelche Ideen?

War es hilfreich?

Lösung

in BaseMatcher müssen Sie Typparameter angeben:

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

, um javac zu ermöglichen, Ihre with Methode entsprechen

PS

imho ist ein Fehler von Eclipse-Compiler

Andere Tipps

Ich habe es erfolgreich aufzubauen, indem <?,?> Zugabe in Matcher SubMatcher.with:

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

Ohne diese ist die Methodensignatur von der Basis unterschiedlich. Ich frage mich, ob es ein Fehler in der @Override Überprüfung, dass dies nicht bemerkt.

Überprüfen Sie die jre oder JDK Sie mit sowohl Eclipse und Terminal kompilieren. Vielleicht könnte es die Version Problem sein.

Funktioniert bei mir:

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

Ich erinnere mich vage, eine solche bugreport, aber können Sie nicht einen Link, um es jetzt geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top