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

dee*_*pak 5 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

new*_*cct 5

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

当您只是在Node内部没有任何明确限定的情况下编写类型时SeperateChainingST,它被隐式限定为SeperateChainingST<Key, Value>.Node.这是一个参数化类型(它有类型参数KeyValue),即使你在写作时没有"看到"它们Node.

如您所知,您不能将数组创建表达式与作为参数化类型的组件类型一起使用:

new HashMap<Key, Value>[5]
Run Code Online (Sandbox Code Playgroud)

所以你做不到

new Node[5] // which is equivalent to
new SeperateChainingST<Key, Value>.Node[5]
Run Code Online (Sandbox Code Playgroud)

但是,您可能也知道,数组创建表达式可以与原始类型的组件类型一起使用,也可以与所有通配符参数化的类型一起使用:

new HashMap[5]
new HashMap<?,?>[5]
Run Code Online (Sandbox Code Playgroud)

我们可以在这里类似地做到这一点,除了你如何获得内部类的原始类型NodeNode正如我们所发现的那样,这不仅仅是.相反,您必须使用外部类的原始类型显式限定它:

new SeperateChainingST.Node[5]
Run Code Online (Sandbox Code Playgroud)

或者使用全通配符:

new SeperateChainingST<?,?>.Node[5]
Run Code Online (Sandbox Code Playgroud)