gpt4 book ai didi

java - 从使用泛型的类中创建数组

转载 作者:行者123 更新时间:2023-11-29 05:49:28 24 4
gpt4 key购买 nike

这是我在那个网站上的第一个问题!我做了我的研究,但没有任何效果......

所以,问题来了,它与 Java 通用数组的创建有关:

class HashArray<K,V>{

class HashNode<K,V>{
...
}


HashNode[] array;

HashArray(int size){

ArrayList<HashNode> arrayM = new ArrayList<HashNode>(size);

array = arrayM.toArray(array); // pinned Line

}

}

并且固定行中存在 NullPointerException。如果我尝试这样的事情:

array = new HashNode[size];

我收到一个泛型数组创建错误

我需要一个来自 HashNodes 的数组,因为我只能用数组来制作项目。

提前致谢!

最佳答案

这里有几个问题。首先,内部类 (HashNode) 隐式引用了其声明类 (HashArray) 的实例。因此,它在其声明类的类型参数的范围内。您不应该重新声明类型参数 KV对于 HashNode ,因为那隐藏了外部的:

class HashArray<K, V> {

class HashNode {
//K and V still have meaning in here
}

...
}

或者,或者制作HashNode一个静态嵌套类来简化你自己的事情:

class HashArray<K, V> {

static class HashNode<K, V> {
//no implicit reference to an outer HashArray
}

...
}

开始创建数组:无法创建具体参数化类型的数组。请参阅 Angelika Langer 的泛型教程以获取 explanation on why .简而言之,泛型和数组就像油和水,你应该只使用集合。

最好的解决方案是只使用 List<HashNode>反而。无论如何你已经开始了:

List<HashNode> nodeList = new ArrayList<HashNode>(size);

或者如果你制作 HashNode一个静态类:

List<HashNode<K, V>> nodeList = new ArrayList<HashNode<K, V>>(size);

请注意,在 Java 7 中,RHS 可以是 new ArrayList<>(size)在这两种情况下。


仅出于我回答的完整性考虑,如果您真的坚持保留数组,则需要使用未经检查的转换:

@SuppressWarnings("unchecked")
HashNode[] array = (HashNode[])new HashArray<?, ?>.HashNode[size];

或者如果HashNode被设为静态:

@SuppressWarnings("unchecked")
HashNode<K, V>[] array = (HashNode<K, V>[])new HashNode<?, ?>[size];

但这本质上是不安全的,不应该这样做

关于java - 从使用泛型的类中创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14501580/

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