这里有几个问题。首先,内部类(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
}
...
}
进入数组创建:无法创建具体参数化类型的数组。请参阅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];
但是,这将是固有的不安全和不应该完成。
'HashNode [] array;'未初始化。您将'array'作为固定行中的参数。如果你将'null'传递给'toArray()',它会抛出NPE。 – jlordo
有没有办法初始化它?鉴于你不能创建对象? – user2007447
'HashNode []数组=新HashNode [0];' – jlordo