Java 为什么我需要声明私有类静态以避免;“通用数组创建”;错误?
下面的代码段抛出错误:“泛型数组创建”,尽管节点类中没有任何泛型实例。但是,如果我将私有类节点声明为静态的,错误就会消失。为什么静态关键字在这里很重要Java 为什么我需要声明私有类静态以避免;“通用数组创建”;错误?,java,generics,Java,Generics,下面的代码段抛出错误:“泛型数组创建”,尽管节点类中没有任何泛型实例。但是,如果我将私有类节点声明为静态的,错误就会消失。为什么静态关键字在这里很重要 public class SeperateChainingST<Key, Value>{ private int M =97; private Node[] st = new Node[M]; private class Node{ Object key;
public class SeperateChainingST<Key, Value>{
private int M =97;
private Node[] st = new Node[M];
private class Node{
Object key;
Object val;
Node next;
}
}
public类独立链接ST{
私有int M=97;
私有节点[]st=新节点[M];
私有类节点{
对象键;
对象val;
节点下一步;
}
}
节点
是一个非静态嵌套类。这意味着它是一个内部类,并且在其外部类的类型参数Key
和Value
的范围内
如果只编写类型节点
,而在separatechainingst
中没有任何显式限定,它将隐式限定为separatechainingst.Node
。这是一个参数化类型(它具有类型参数键
和值
),即使您在写入节点
时没有“看到”它们
如您所知,不能对参数化类型的组件类型使用数组创建表达式:
new HashMap<Key, Value>[5]
或者使用所有通配符方式:
new SeperateChainingST<?,?>.Node[5]
new separatechainingst.Node[5]
您不需要先定义节点类,然后再使用它吗?@kickbutowski不,Java没有令人讨厌的前向声明规则。也许这会对您有所帮助。简而言之,您可以尝试使用private separatechainingst.Node[]st=new separatechainingst.Node[M]代码>但不鼓励使用原始类型。相反,您应该使用集合,如private List=new ArrayList()代码>我在创建数组时并没有使用泛型类型,而是使用了原始类型(这被认为是容易出错的,所以编译器会向我们发出警告,而不是错误)。我用过列表。@Pshemo我用列表试试。谢谢
new HashMap[5]
new HashMap<?,?>[5]
new SeperateChainingST.Node[5]
new SeperateChainingST<?,?>.Node[5]