【发布时间】:2014-12-01 02:00:09
【问题描述】:
我有以下课程:
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 错误。
【问题讨论】:
-
我宁愿说一个 JDK 错误,因为它似乎破坏了向后兼容性!
-
我不记得细节了,但如果我没记错的话,JDK 7 中有一个错误允许这样的事情发生,而 JDK 8 有更严格的检查。所以,是的,向后兼容性的突破,但是是故意的。
-
有关更多详细信息,请参阅 Oracle 文档中的 Incompatibilities between JDK 8 and JDK 7。
-
这是 JDK 中的一个错误。这是最特定类型的简单重载解决方案,即。
OverloadTest,应该选择。
标签: java eclipse javac jls ecj