我有以下课程:
import java.util.HashSet;
import java.util.List;
public class OverloadTest<T> extends HashSet<List<T>> {
private static final long serialVersionUID = 1L;
public OverloadTest(OverloadTest<? extends T> other) {}
public OverloadTest(HashSet<? extends T> source) {}
private OverloadTest<Object> source;
public void notAmbigious() {
OverloadTest<Object> o1 = new OverloadTest<Object>(source);
}
public void ambigious() {
OverloadTest<Object> o2 = new OverloadTest<>(source);
}
}
这在 JDK 7 的 javac 和 eclipse 下编译得很好(合规性设置为 1.7 或 1.8)。但是,尝试在 JDK 8 的 javac 下编译时,出现以下错误:
[ERROR] src/main/java/OverloadTest.java:[18,35] reference to OverloadTest is ambiguous
[ERROR] both constructor <T>OverloadTest(OverloadTest<? extends T>) in OverloadTest and constructor <T>OverloadTest(java.util.HashSet<? extends T>) in OverloadTest match
请注意,此错误仅适用于方法中的构造函数调用ambigous()
,而不适用于方法中的构造函数调用notAmbiguous()
。唯一的区别是ambiguous()
依赖于钻石算子。
我的问题是:JDK 8 下的 javac 是否正确标记了一个模棱两可的分辨率,或者 JDK 7 下的 javac 未能捕捉到模棱两可?根据答案,我需要提交 JDK 错误或 ecj 错误。