ここにはいくつかの問題があります。まず、内部クラス ( 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
}
...
}
配列の作成について: 具体的なパラメーター化された型の配列は作成できません。なぜ. _ つまり、ジェネリックと配列は油と水のようなものであり、コレクションを使用する必要があります。
最善の解決策は、List<HashNode>
代わりに a を使用することです。とにかく、あなたはすでに1つから始めています:
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];
しかし、これは本質的に危険であり、実行すべきではありません。