1

そのサイトでの私の最初の質問です!私は自分の研究をしましたが、実際には何も機能しません...

したがって、ここに問題があります。これは、JavaGenericArrayの作成に関係しています。

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
    }

    ...
}

配列の作成について: 具体的なパラメーター化された型の配列は作成できません。なぜ. _ つまり、ジェネリックと配列は油と水のようなものであり、コレクションを使用する必要があります。

最善の解決策は、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];

しかし、これは本質的に危険であり、実行すべきではありません

于 2013-01-24T14:23:02.010 に答える