为什么静态嵌套类?

Pet*_*xwl 5 java

我有一个try的示例代码.代码似乎没有编译错误.为什么它使用静态嵌套类节点?当我staticNode嵌套类中删除并编译时,错误显示create generic arrayprivate Node[] next = new Node[R];.究竟发生了什么?

public class TrieST<Value> {
    private static final int R = 256;        // extended ASCII


    private Node root;      // root of trie
    private int N;          // number of keys in trie

    // R-way trie node
    private static class Node {
        private Object val;
        private Node[] next = new Node[R];
    }


    public TrieST() {
    }
}
Run Code Online (Sandbox Code Playgroud)

Tar*_*rik 2

假设在您的代码片段中您使用的是非静态内部类而不是像这样的静态嵌套类:private class Node在这种情况下,您将尝试实例化 anArray这是不可能的,我们无法Array在泛型中实例化 an类,因为泛型在运行时没有任何关于其类型的信息,而数组创建表达式指定元素类型。

因此,使用编译的静态嵌套类的原因是,此类类被视为“顶级”类(就行为而言):

静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。

现在,让我们考虑所有这些,然后回到编译器显示的确切错误:

无法创建通用数组TrieST<Value>.Node

这意味着array您要创建的类型的TrieST<Value>.Node运行时类型是未知的,因此可能会在数组中插入不同的类型next可以在无法创建参数化类型的数组中找到更清晰且解释良好的示例

然而,静态嵌套类的行为并不像 的内部类TrieST<Value>,因此在内部初始化数组Node不会是非法的,因为它不是 类型TrieST<Value>.Node,而是 类型Node就像它是顶级类一样)。