Wir haben einige Komponententests, die kompilieren und in Eclipse 3.4 funktionieren, aber wenn wir versuchen, sie mit javac zu kompilieren, schlägt es fehl. Ich habe es geschafft, den Code auf ein kleines und eigenständiges Programm zu reduzieren, so dass es keine externen Abhängigkeiten gibt. 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 mag:Warum kompiliert Eclipse dies, aber Javac nicht?
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 mit JDK 1.5.0_10
versucht haben, 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() zurück, aber der Compiler scheint zu denken, dass der Rückgabetyp BaseMatcher ist. Es ist jedoch möglich, dass der Eclipse-Compiler fälschlicherweise etwas zulässt, was nicht sein sollte.
Irgendwelche Ideen?
Ich kann diesen Compiler-Fehler mit jdk 1.6 unter Linux reproduzieren. Scheint, dass die kovarianten Rückgabetypen, die mit Java 1.5 eingeführt wurden, in diesem Beispiel nicht korrekt funktionieren. – Mnementh