Почему Eclipse это компилирует, а javac нет?
-
19-09-2019 - |
Вопрос
У нас есть несколько модульных тестов, которые нормально компилируются и выполняются в 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 <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 неправильно разрешает то, чего не должно быть.
Есть идеи?
Решение
в BaseMatcher нужно указать параметры типа:
public SubMatcher with(Matcher<?, ?> matcher) {
чтобы позволить javac соответствовать вашему with
метод
ПС
имхо это ошибка компилятора eclipse
Другие советы
Я успешно построил его, добавив <?,?>
к Matcher
в SubMatcher.with
:
class SubMatcher extends BaseMatcher {
@Override
public SubMatcher with(Matcher<?,?> matcher) {
return this;
}
}
Без этого сигнатура метода будет отличаться от базовой.Интересно, есть ли ошибка в @Override
проверяющий, который этого не замечает.
Проверьте, какой jre или jdk вы компилируете как в Eclipse, так и в терминале.Возможно, дело в версии.
Работает для меня:
$ 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 $
Я смутно помню такой багрепорт, но сейчас не могу дать на него ссылку.