Java 8 双花括号初始化和名称冲突
以下类有一个名为 的内部类。此代码不会在 Java 8 中编译,因为编译器假定在双大括号初始值设定项中引用的是类型而不是 。此代码在 JDK 的早期版本(至少 6 和 7)中编译,但在 JDK 8 中已损坏。我的问题是“为什么? 未在此类中导入,因此编译器没有理由假定该值为 类型 。是否有一些隐式范围被引入或匿名类的东西?Entry
Entry
Map.Entry
Scope.Entry
Map.Entry
Map.Entry
错误:
scope/Scope.java:23: error: incompatible types: scope.Scope.Entry cannot be converted to java.util.Map.Entry for (final Entry entry : entries) {
scope/Scope.java:22: error: cannot find symbol put(entry.getName(), entry);
示例代码:
package scope;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class Scope {
public static class Entry<T> {
public String getName() {
return "Scope";
}
}
public static void main(String[] args) {
final Set<Entry> entries = new HashSet<>();
new HashMap<String, Entry>() {{
// Why does the Java 8 compiler assume this is a Map.Entry
// as it is not imported?
for (final Entry entry : entries) {
put(entry.getName(), entry);
}
}};
}
}