1

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

所以,这就是问题所在,它与 Java Generic Array 创建有关:

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 中的数组,因为我只被允许使用数组制作项目。

先感谢您!

4

1 回答 1

3

这里有几个问题。首先,内部类 ( HashNode) 具有对其声明类 ( HashArray) 实例的隐式引用。因此,它在其声明类的类型参数的范围内。您不应该重新声明类型参数KVfor 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 的泛型教程。简而言之,泛型和数组就像油和水,你应该只使用集合。

最好的解决方案是只使用 a 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];

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

于 2013-01-24T14:23:02.010 回答