У нас есть несколько модульных тестов, которые нормально компилируются и выполняются в Eclipse 3.4, но когда мы пытаемся скомпилировать их с помощью javac, это не удается. Мне удалось сократить код до чего-то небольшого и автономного, поэтому он не имеет внешних зависимостей. Сам код не будет иметь особого смысла, поскольку весь он вырван из контекста, но это не имеет значения — мне просто нужно выяснить, почему 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 {}
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 ошибочно разрешает то, чего не должно быть.
Есть идеи?
Подробнее здесь:
https://stackoverflow.com/questions/117 ... vac-doesnt