为什么我需要声明一个私有类静态以避免"通用数组创建"错误?

时间:2014-12-11 05:04:36

标签: java generics

以下代码段会引发错误:"通用阵列创建"尽管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;
        }
    }

1 个答案:

答案 0 :(得分:5)

Node是一个非静态嵌套类。这意味着它是一个内部类,它位于其外部类的类型参数KeyValue的范围内。

如果您只是在Node内部没有任何明确限定的情况下编写SeperateChainingST类型,则隐式限定为SeperateChainingST<Key, Value>.Node。这是一个参数化类型(它具有类型参数KeyValue),即使您在编写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]