在OpenJDK中引用方法是不明确的,但不是Eclipse - 为什么?

时间:2015-11-12 13:52:45

标签: java eclipse generics openjdk incompatibility

我知道已经提出了类似的问题(hereherehere),但没有一个答案似乎适用于我的案例。

考虑以下一组接口:

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中的StringI3实例化,我看不到问题的来源。请注意,Eclipse认为这很好。

1 个答案:

答案 0 :(得分:1)

问题的答案,“为什么?”很简单,但可能不是你想要的。它是,“因为Eclipse和Open JDK都有自己的编译器和a)其中一个有bug或b)语言规范(JLS)含糊不清,他们对它的解释不同。”

确定a)或b)中的哪一个是一个棘手,繁琐的任务。这意味着,作为一个起点,阅读JLS的相关部分,尝试使用Oracle JDK的javac编译相同的代码,并可能潜入Eclipse和OpenJDK的错误跟踪系统。