我知道已经提出了类似的问题(here,here,here),但没有一个答案似乎适用于我的案例。
考虑以下一组接口:
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认为这很好。
答案 0 :(得分:1)
问题的答案,“为什么?”很简单,但可能不是你想要的。它是,“因为Eclipse和Open JDK都有自己的编译器和a)其中一个有bug或b)语言规范(JLS)含糊不清,他们对它的解释不同。”
确定a)或b)中的哪一个是一个棘手,繁琐的任务。这意味着,作为一个起点,阅读JLS的相关部分,尝试使用Oracle JDK的javac
编译相同的代码,并可能潜入Eclipse和OpenJDK的错误跟踪系统。