这里有几个问题。首先,内部类 ( HashNode
) 具有对其声明类 ( HashArray
) 实例的隐式引用。因此,它在其声明类的类型参数的范围内。您不应该重新声明类型参数K
和V
for 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];
但这本质上是不安全的,不应该这样做。