为什么内部类TreeMap.Entry <k,v>泛型?</k,v>

时间:2013-03-18 11:52:48

标签: java generics collections treemap

为什么会这样?

static final class Entry<K,V> implements Map.Entry<K,V>

为什么不这样做:

 static final class Entry implements Map.Entry<K,V>

3 个答案:

答案 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定义它以从接口本身推断类型。