这是该网站上的第一个问题!
我已经完成研究,但没有任何效果。

因此,这里的问题与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重新声明类型参数VHashNode,因为这隐藏了外部参数:

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];


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

09-28 12:48