Вопрос

У нас есть несколько модульных тестов, которые нормально компилируются и выполняются в 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 
$

Я смутно помню такой багрепорт, но сейчас не могу дать на него ссылку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top