У нас есть некоторые модульные тесты, которые компилируются и выполняются отлично в Eclipse 3.4, но когда мы пытаемся скомпилировать их с помощью javac, это терпит неудачу. Мне удалось перевести код на что-то маленькое и автономное, поэтому он не имеет внешних зависимостей. Сам код не имеет особого смысла, потому что это все из контекста, но это не имеет значения, - мне просто нужно выяснить, почему Javac не нравится:Почему Eclipse компилирует это, но javac нет?
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;
}
}
Я попытался с JDK 1.5.0_10
и 1.6.0_13
, с тем же результатом:
Test.java:6: matchOn(test.SubMatcher) in test.Test cannot be applied to (test.BaseMatcher)
matchOn(someMatcher().with(anotherMatcher()));
^
1 error
Я думаю, что это вполне допустимо Java. Метод SubMatcher.with() возвращает более конкретный тип, чем BaseMatcher.with(), но, похоже, компилятор считает, что тип возврата - BaseMatcher. Однако возможно, что компилятор Eclipse неправильно разрешает то, чего он не должен.
Любые идеи?
Я могу воспроизвести эту ошибку компилятора с помощью jdk 1.6 на Linux. Кажется, что ковариантные типы возвращаемых данных, введенные с Java 1.5, не работают корректно в этом примере. – Mnementh