以下代码段会引发错误:"通用阵列创建"尽管Node类中没有任何通用实例。但是,如果我将私有类Node声明为静态,则错误消失。为什么静态关键字在这里很重要?
public class SeperateChainingST<Key, Value>{
private int M =97;
private Node[] st = new Node[M];
private class Node{
Object key;
Object val;
Node next;
}
}
答案 0 :(得分:5)
Node
是一个非静态嵌套类。这意味着它是一个内部类,它位于其外部类的类型参数Key
和Value
的范围内。
如果您只是在Node
内部没有任何明确限定的情况下编写SeperateChainingST
类型,则隐式限定为SeperateChainingST<Key, Value>.Node
。这是一个参数化类型(它具有类型参数Key
和Value
),即使您在编写Node
时没有“看到”它们。
如您所知,您不能将数组创建表达式用作参数化类型的组件类型:
new HashMap<Key, Value>[5]
所以你做不到
new Node[5] // which is equivalent to
new SeperateChainingST<Key, Value>.Node[5]
但是,您可能也知道,数组创建表达式可以与原始类型的组件类型一起使用,也可以与所有通配符参数化的类型一起使用:
new HashMap[5]
new HashMap<?,?>[5]
我们可以在这里类似地做,除了你如何获得内部类Node
的原始类型?正如我们所发现的,它不只是Node
。相反,您必须使用外部类的原始类型明确限定它:
new SeperateChainingST.Node[5]
或使用全通配符:
new SeperateChainingST<?,?>.Node[5]