Ссылка на метод неоднозначна в OpenJDK, но не в Eclipse - почему?

Я знаю, что подобные вопросы задавались (здесь, здесь, здесь), но ни один из ответов не подходит для моего случая.

Рассмотрим следующий набор интерфейсов:

public interface I1<X> {
    void method(X arg);
}

public interface I2 {
    void method(String arg);
}

public interface I3 extends I1<String>, I2 {
    // empty
}

Теперь я хочу вызвать method(String) для экземпляра I3, например:

public class C implements I3 {
    public void method(String arg) {
        // does nothing
    }

    public static void main(String[] args) {
        ((I3) new C()).method("arg");
    }
}

OpenJDK (Java 7 или 8, не имеет значения) помечает здесь ошибку несовместимости:

generics\C.java:10: error: reference to method is ambiguous
    ((I3) new C()).method("arg");
                  ^
both method method(String) in I2 and method method(X) in I1 match
where X is a type-variable:
    X extends Object declared in interface I1

Поскольку X инстанцируется в String в I3, я не понимаю, откуда берется проблема. Обратите внимание, что Eclipse считает, что это нормально.


person Arend    schedule 12.11.2015    source источник


Ответы (1)


Ответ на вопрос "почему?" просто, но, вероятно, не то, что вы ищете. Это так: «Потому что у Eclipse и Open JDK есть свои собственные компиляторы, и либо а) в одном из них есть ошибка, либо б) спецификация языка (JLS) неоднозначна, и они интерпретировали ее по-разному».

Выяснение того, что из а) или б) является сложной и утомительной задачей. Это означает, в качестве отправной точки, чтение соответствующих разделов JLS, попытку скомпилировать тот же код с помощью Oracle JDK javac и, возможно, погрузиться в системы отслеживания ошибок Eclipse и OpenJDK.

person E-Riz    schedule 12.11.2015
comment
Почему следует расширить, чтобы кто-нибудь понял, почему OpenJDK считает это несовместимым? - person Arend; 12.11.2015