为什么会这样?
static final class Entry<K,V> implements Map.Entry<K,V>
为什么不喜欢:
static final class Entry implements Map.Entry<K,V>
为什么会这样?
static final class Entry<K,V> implements Map.Entry<K,V>
为什么不喜欢:
static final class Entry implements Map.Entry<K,V>
但是Entry 类已经从顶级TreeMap 中知道类型K 和V。而且它仍然可以安全地输入。看起来 Entry 知道 TreeMap K 和 V,但是创建了自己的参数类型
事实上,它没有:
public class Main<T> {
static final class Entry {
T t; // ERROR: Cannot make a static reference to the non-static type T
void f(T t) {} // ERROR: Cannot make a static reference to the non-static type T
}
}
另一方面,以下编译没有错误:
public class Main<T> {
static final class Entry<T> {
T t;
void f(T t) {}
}
}
嗯,理解Entry为什么不能使用外层map参数的关键在于static
关键字,用来声明它。
K,V 的实际类型只知道外部 Map 的实例,而 Entry 只知道 Map类。所以 Entry 必须是泛型类型,有自己的泛型参数。别介意它们在外部类(映射)中被命名为 K,V,它们标识不同的参数。
static final class Entry implements Map.Entry<K,V>
这不是 Java 中的有效语句,因为 Entry 接口是参数化的,并且不支持从周围元素自动推断参数化类型。Java 7 在这个方向上迈出了正确的一步,引入了菱形运算符。但是,我们需要等到 JLS 定义它才能从接口本身推断类型。