ここにはいくつかの問題があります。まず、内部クラス ( HashNode) には、その宣言クラス ( HashArray) のインスタンスへの暗黙的な参照があります。したがって、宣言クラスの型パラメーターのスコープ内にあります。型パラメーターKとVfor を再宣言しないでください。これ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];
しかし、これは本質的に危険であり、実行すべきではありません。