5

toArrayメソッドは、インターフェース<E>に渡されたものを非表示にしCollection<E>ます。以下はメソッドシグネチャです。

<T> T[] toArray(T[] a);

そのため、以下が可能です。そして結果はArrayStoreException

ArrayList<String> string = new ArrayList<String>();
string.add("1");
string.add("2");
Integer intArray[] = new Integer[2];
intArray = string.toArray(intArray);

なぜそのような決定が下されたのか知りたかったのですか?APIの設計中にこのようなケースが許可されたのはなぜですか?とにかく、このコードは結果としてRuntimeException

4

4 に答える 4

3

このtoArray方法は、ジェネリックスの導入よりも前のものです。の元の署名はtoArray任意Object[]です。

これは、ジェネリックで、ジェネリックの前に許可されていたのと同じ入力を受け入れる唯一の方法です。ただし、任意のものを使用する利点は、T[]渡されたものと同じ配列型を返すことができることです。

于 2012-10-28T05:29:32.763 に答える
0

を呼び出すと、intArray = string.toArray(intArray);配列を作成して値を返すことが期待されているIntegerため、戻り型は次のT[]ようInteger[]になります。

このようなメソッドを呼び出しても、文字列リストを自動的にに変換できるわけではありませんInteger []。上記のメソッド呼び出しは、になりjava.lang.ArrayStoreExceptionます。

これは、コンバーチブルクラス(基本クラス/サブクラス)の使用を許可するために行われます。例:以下:

  List<Integer> list = new ArrayList<Integer>();
  list.add(1);

  Integer[] intArray = new Integer[1];
  intArray = list.toArray(intArray); //Success

  Number [] numArray = new Number[1];
  numArray = list.toArray(numArray);//Success

  Double [] dubArray = new Double[1];
  dubArray = list.toArray(dubArray); //Failure(ArrayStoreException)
于 2012-10-28T05:22:09.823 に答える
0

の配列のタイプを自問するときtoArray()、最初の最も明白な方法はT、のスーパータイプに制限することですE(これにTは、と同じであるかどうかが含まれますE):これは理にかなっています-要素をコピーできるようにするコレクションよりも一般的な要素タイプの配列に変換します。ただし、これは一見タイプセーフに見えますが(つまり、実行時に例外が発生しないようにコンパイル時にチェックされます)、完全にタイプセーフではありません。タイプの変数は、のサブタイプであるタイプの任意T[]の配列を保持できます。 。したがって、のスーパータイプに制限した場合でも(そして、と同じに制限した場合でも)を取得することは可能です。U[]UTArrayStoreExceptionTETE)。さらに、Javaでは型パラメーターの境界が許可されていないため、Tのスーパータイプにしかなり得ない方法でこのメソッドを宣言することは困難です。Esuper

質問の例にはT、のスーパータイプではないが含まれていEます。なぜこれを許可する必要があるのですか?これはタイプセーフではなく、コレクションの要素が実際に配列の実際のタイプのサブタイプである場合にのみ機能します。ただし、これは、スーパータイプをに制限する状況よりも悪くはない、またはと同じである場合でも、上記で説明したように、これらの制限のいずれもタイプセーフにすることはできないため、これはまだ悪いことではないと主張できます。 。このメソッドをどのように宣言しても、取得することは可能です。それで、それが悪くなければ、それをできるだけ一般的にしてみませんか?TETEArrayStoreException

于 2012-11-01T00:59:50.350 に答える
-1

string.toArray(intArray)タイプの配列を返しますString; ただし、型の配列であることが望まれますIntegerArrayStoreExceptionタイプが一致しないため、これにより、指定した例外が返されます。

于 2012-10-28T05:31:31.233 に答える