[英]Why static nested class?
我有一个try的示例代码。代码似乎没有编译错误。 为什么它使用静态嵌套类节点? 当我在Node
嵌套类中删除static
并编译时,错误显示在private Node[] next = new Node[R];
中create generic array
private 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() {
}
}
假设在你的代码片段中你使用的是非静态内部类而不是像这样的静态嵌套类: private class Node
,在这种情况下,你将试图实例化一个不可能的Array
, 我们无法实例化泛型类中的Array
,因为泛型在运行时没有关于其类型的任何信息,而数组创建表达式指定了元素类型。
因此,使用静态嵌套类编译的原因是这些类被视为“顶级”类(就行为而言):
静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。 实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。
现在,让我们考虑所有这些,并回到编译器显示的确切错误:
无法创建
TrieST<Value>.Node
的通用数组
这意味着您要创建的array
的类型是TrieST<Value>.Node
其运行时的类型未知,因此可以将不同的类型插入到next
数组中。 可以在“无法创建参数化类型的数组”中找到更清晰且解释良好的示例
而,静态嵌套类不表现为一个内部类的TrieST<Value>
,从而instiating里的数组Node
,因为它是类型的不不会非法TrieST<Value>.Node
,所述类型的其Node
( 例如 ,如果这是一个顶级课程。
因为使用static你创建: Node[] next = new Node[R]
并且使用非静态内部类创建一个与外部类的实例相关联的Node,它具有泛型类型。 并且禁止创建通用数组。
但是让我们备份几个步骤:实例化内部类(非静态)的方法如下(示例):
class TrieST<V> {
private static final int R = 256;
private Node root; // root of trie
private int N; // number of keys in trie
private TrieST<String> inst = new TrieST<String>(); // must create an instance of the outer class first
// R-way trie node
private class Node {
private Object val;
private TrieST<String>.Node next = inst.new Node(); //must use an instance of the outer class to instantiate an object of the inner class
}
public TrieST() {
}
}
现在,如果我们尝试将上面的实现从内部类的实例更改为数组,我们将获得通用数组创建,因为由于数组的协方差性质而禁止创建具有泛型类型的数组( Shape[]
是super
的Triangle[]
),它不能很好地处理泛型的不变性 ( List<Object>
不是 List<String>
超级)。 在“Effective Java”中,如果您想深入了解,Bloch会提供更详细的解释。
如果你坚持使用内部类,你可以通过使用Array.newInstance()
来解决这个限制,它可以创建一个只在运行时知道的类型的数组,如下所示:
private Node[] next = (Node[]) Array.newInstance(Node.class, R);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.