6

重複の可能性:
Java の方法: 汎用配列の作成
エラー: 汎用配列の作成

このエラーが発生しています:

Cannot create a generic array of T

これは私のコードです(6行目のエラー):

1    public class HashTable<T> {
2    
3        private T[] array;
4    
5        HashTable(int initSize) {
6            this.array = new T[initSize];
7        }
8    }

このエラーが表示される理由と、それを修正するための最善の解決策を考えています。ありがとう。

アップデート:

配列が代わりにリンクされたリストを取得するようにコードを調整しましたが、新しいエラーが発生しています。

これが私のエラーです:

Cannot create a generic array of LinkedList<T>

これが私のコードです(6行目のエラー):

1    public class HashTable<T> {
2    
3        private LinkedList<T>[] array;
4    
5        HashTable(int initSize) {
6            this.array = new LinkedList<T>[initSize];
7        }
8    }

このエラーはまったく同じ理由ですか? 私は、一般的なリンク リストを作成して、それらを配列に格納できると想定していました。

4

3 に答える 3

8

はい、ジェネリック配列は作成できません。私が知っている最善の回避策は、代わりにコレクションを使用することです。

private List<T> list;

.......

list = new ArrayList<T>();
于 2012-05-01T13:39:17.797 に答える
3

ジェネリック配列はリフレクションを介して作成できますが(安全でないキャストが必要ですが)、クラスをパラメーターとして渡す必要があります(次のメソッドが<T>型パラメーターを定義するクラス内にあると仮定します)。

@SuppressWarnings("unchecked")
public T[] createArray(Class<T> klass, int size) {
    return (T[]) Array.newInstance(klass, size);
}

たとえば、あなたの場合:

HashTable<Integer> t = new HashTable<Integer>();
Integer[] intArray = t.createArray(Integer.class, 4);
intArray[0] = 1; intArray[1] = 2;
intArray[2] = 3; intArray[3] = 4;

System.out.println(Arrays.toString(intArray));
> [1, 2, 3, 4]
于 2012-05-01T13:55:17.990 に答える
2

T を (Java で) 作成することはできませんが、T[] は内部的に Object[] と同じです。

public class HashTable<T> {

    private T[] array;

    @SuppressWarnings("unchecked")
    HashTable(int initSize) {
        this.array = (T[]) new Object[initSize];
    }
}

(コンパイルされます、私はチェックしました)

newacct のコメントにより、Object[] を使用して項目を T にキャストする方がおそらく良いでしょう。

public class HashTable<T> {

    private Object[] array;

    public HashTable(int initSize) {
        this.array = new Object[initSize];
    }

    public void put(String pKey, T pItem) {
       ...
       array[x] = pItem;
       ....
    }
    public T get(String pKey) {
       ...
       return (T) array[x];
    }
}
于 2012-05-01T16:00:04.510 に答える