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]