Java8中的模棱两可的重载 - ECJ或javac是对的吗?
我有以下类:
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错误。