gpt4 book ai didi

java - 为什么我需要将私有(private)类声明为静态以避免 "Generic Array Creation"错误?

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:58 24 4
gpt4 key购买 nike

尽管 Node 类中没有任何通用实例,但以下代码片段会引发错误:“通用数组创建”。但是,如果我将私有(private)类 Node 声明为 static ,错误就会消失。为什么 static 关键字在这里很重要?

 public class SeperateChainingST<Key, Value>{

private int M =97;
private Node[] st = new Node[M];

private class Node{
Object key;
Object val;
Node next;
}
}

最佳答案

Node是一个非静态嵌套类。这意味着它是一个内部类,并且在类型参数Key 的范围内。和 Value它的外部类。

当您简单地编写类型 NodeSeperateChainingST 中没有任何明确的资格, 它隐式限定为 SeperateChainingST<Key, Value>.Node .这是一个参数化类型(它具有类型参数 KeyValue ),即使您在编写 Node 时没有“看到”它们.

如您所知,您不能将数组创建表达式与参数化类型的组件类型一起使用:

new HashMap<Key, Value>[5]

所以你不能这样做

new Node[5] // which is equivalent to
new SeperateChainingST<Key, Value>.Node[5]

但是,正如您可能还知道的那样,数组创建表达式可用于原始类型的组件类型,或使用所有通配符参数化的类型:

new HashMap[5]
new HashMap<?,?>[5]

我们可以在这里做类似的事情,除了你如何获得内部类的原始类型Node ?它不仅仅是 Node ,正如我们所发现的。相反,您必须使用外部类的原始类型明确限定它:

new SeperateChainingST.Node[5]

或者用全通配符的方式:

new SeperateChainingST<?,?>.Node[5]

关于java - 为什么我需要将私有(private)类声明为静态以避免 "Generic Array Creation"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27415693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com