2

为什么会这样?

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

为什么不喜欢:

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

3 回答 3

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) {}
    }
}
于 2013-03-18T12:03:04.883 回答
4

嗯,理解Entry为什么不能使用外层map参数的关键在于static关键字,用来声明它。

K,V 的实际类型只知道外部 Map 的实例,而 Entry 只知道 Map。所以 Entry 必须是泛型类型,有自己的泛型参数。别介意它们在外部类(映射)中被命名为 K,V,它们标识不同的参数。

于 2013-03-18T12:08:28.570 回答
0
static final class Entry implements Map.Entry<K,V>

这不是 Java 中的有效语句,因为 Entry 接口是参数化的,并且不支持从周围元素自动推断参数化类型。Java 7 在这个方向上迈出了正确的一步,引入了菱形运算符。但是,我们需要等到 JLS 定义它才能从接口本身推断类型。

于 2013-03-18T12:15:04.797 回答