这是该网站上的第一个问题!
我已经完成研究,但没有任何效果。
因此,这里的问题与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];
我得到一个
Generics Array Creation error
。我需要HashNodes之外的Array,因为只允许使用数组制作项目。
先感谢您!
最佳答案
这里有一些问题。首先,内部类(HashNode
)对其声明类(HashArray
)的实例具有隐式引用。因此,它在声明类的类型参数的范围内。您不应为K
重新声明类型参数V
和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
}
...
}
进行数组创建:无法创建具体参数化类型的数组。有关explanation on why的信息,请参见Angelika Langer的泛型教程。简而言之,泛型和数组就像油和水,您应该只使用集合。
最好的解决方案是只使用
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];
但这本质上是不安全的,因此不应该这样做。