尽管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)
Node是一个非静态嵌套类.这意味着它是一个内部类,它是类型参数的范围内,Key和Value它的外部类的.
当您只是在Node内部没有任何明确限定的情况下编写类型时SeperateChainingST,它被隐式限定为SeperateChainingST<Key, Value>.Node.这是一个参数化类型(它有类型参数Key和Value),即使你在写作时没有"看到"它们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)
我们可以在这里类似地做到这一点,除了你如何获得内部类的原始类型Node?Node正如我们所发现的那样,这不仅仅是.相反,您必须使用外部类的原始类型显式限定它:
new SeperateChainingST.Node[5]
Run Code Online (Sandbox Code Playgroud)
或者使用全通配符:
new SeperateChainingST<?,?>.Node[5]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |