0

こんにちは、初期化するにはどうすればよいですか

ArrayList<Record<T>> [] values;

行と列の数で?たとえば、3 つの行と 4 つの列でしょうか。

4

2 に答える 2

2

ジェネリック型(などArrayList<T>)の配列を使用することは、地獄への道です。次の行はコンパイルすらしません:

ArrayList<Record<T>>[] values = new ArrayList<Record<T>>[SIZE_ARRAY];

コンパイラはこのエラーを発行します:

Cannot create a generic array of ArrayList<Record<T>>

唯一の賢明な解決策は、リストのリストを作成することです。

// create matrix
ArrayList<ArrayList<Record<T>>> matrix = new ArrayList<ArrayList<Record<T>>>();

// add 3 rows:
for (int i = 0; i < 3; i++) {
    ArrayList<Record<T>> row = new ArrayList<Record<T>>();
    matrix.add(row);

    // add 4 elements to each row
    for (int j = 0; j < 4; j++) {
        Record<T> record = ... // get the record
        row.add(record);
    }
}

これで、[2] [3](最後の行の最後の要素)の要素にアクセスできます。

Record<T> record = matrix.get(2).get(3);
于 2012-11-28T16:05:55.793 に答える
0

ただ行う:

ArrayList<Record<T>>[] values = (ArrayList<Record<T>>[])new ArrayList<?>[SIZE_ARRAY];

チェックされていないキャスト警告が表示されますが、基本的に無視できます。

パラメーター化された型の配列の作成が許可されていない本当の理由は、一種の難解です。Java の配列 (ジェネリック コレクションとは異なり) には、実行時にチェックされる機能があります (そして常にあります)。つまり、要素を配置するたびに、その要素が配列のコンポーネント タイプ (実行時に認識します)。そうでない場合は、例外 (ArrayStoreException) をスローします。

ここで、パラメーター化された型の配列について考えてみましょう。上記の配列の動作を知っていれば、パラメーター化された型の配列は、その配列に入れられたものがそのパラメーター化された型のインスタンスであることを確認することが期待できます。ArrayList<Something>ただし、Javaでは実行時にパラメータ化された型 ( ) のインスタンスであることを確認することはできません。あなたができることは、それが であることを確認することですが、ArrayListそのパラメーターではありません。

Java の設計者は、人々が期待することを完全に行うわけではないため、パラメータ化された型の配列の作成を完全に禁止することにしました。生の型の配列 (例: new ArrayList[5]) またはワイルドカード型の配列(例: ) を作成することもできますnew ArrayList<?>[5]。これらの場合、オブジェクトが実行時にインスタンスであるかどうかを確認できるためです (つまりobj instanceof ArrayList正当obj instanceof ArrayList<?>であるが、obj instanceof ArrayList<Something>そうではない) 。 )。(パラメータ化された型の配列が、パラメータ化された型ではなく生の型に対してのみ要素をチェックするという特殊なケースを作成することもできましたが、それによって不整合が生じる可能性があります。)しかし、おそらく、この問題に遭遇したほとんどの人は、この機能について考えていません。実行時に要素の型をチェックするための配列の数 - おそらく、通常の使用のために配列を作成したいだけです。

配列をパラメーター化された型の配列にキャストすることもできます。上記で説明したように、パラメーター化された型の配列が配列のコントラクトを満たし、その要素の型を完全にチェックする方法がないため、これはチェックされていないキャストArrayList<String>[]ですArrayList<Integer>。例外を生成せずに配列に。しかし、99% の人はこの機能を気にしていません。

于 2012-11-28T19:41:36.900 に答える