Следующий класс имеет внутренний класс, называемый Entry
. Этот код не будет компилироваться в Java 8, поскольку компилятор предполагает, что Entry
, указанный в двойном курсивом, имеет тип Map.Entry
, а не Scope.Entry
. Этот код компилируется в предыдущих версиях (не менее 6 и 7) JDK, но в JDK нарушен. Мой вопрос: "почему?" 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);
}
}};
}
}