为什么会这样?
static final class Entry<K,V> implements Map.Entry<K,V>
为什么不这样做:
static final class Entry implements Map.Entry<K,V>
答案 0 :(得分:4)
但是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) {}
}
}
答案 1 :(得分:4)
嗯,理解Entry无法使用外部地图参数的关键在于static
关键字,用于声明它。
K,V的实际类型仅对外部Map的实例是已知的,而Entry只知道Map 类。因此,Entry必须是泛型类型,具有自己的通用参数。别介意它们被命名为K,V和外层(Map)一样,它们识别出不同的参数。
答案 2 :(得分:0)
static final class Entry implements Map.Entry<K,V>
这不是Java中的有效语句,因为Entry接口是参数化的,并且不支持从周围元素自动推理参数化类型。通过引入钻石操作符,Java 7在这个方向上迈出了正确的一步。但是,我们需要等到JLS定义它以从接口本身推断类型。