web-dev-qa-db-ja.com

オブジェクト配列を整数配列にキャストするエラー

次のコードの何が問題になっていますか?

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;

コードの最後の行には次のエラーがあります。

スレッド「メイン」の例外Java.lang.ClassCastException:[Ljava.lang.Object; [Ljava.lang.Integer;にキャストできません。

62
Ross

ロス、Arrays.copyof()またはArrays.copyOfRange()も使用できます。

Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);

ここでClassCastExceptionをヒットする理由は、Integerの配列をObjectの配列として扱うことができないからです。 Integer[]Object[]のサブタイプですが、Object[]Integer[]ではありません。

また、以下もClassCastExceptionを与えません。

Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
88
namalfernandolk

Object配列をInteger配列にキャストすることはできません。 aのすべての要素をループして、それぞれを個別にキャストする必要があります。

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = new Integer[a.length];
for(int i = 0; i < a.length; i++)
{
    c[i] = (Integer) a[i];
}

編集:この制限の背後にある理論的根拠は、キャスト時にJVMが実行時に型安全性を確保したいということだと思います。 Objectsの配列はIntegers以外の任意のものになる可能性があるため、JVMは上記のコードが実行していることを実行する必要があります(各要素を個別に確認します)。言語設計者は、JVMにそれを行わせたくないと判断しました(理由はわかりませんが、それが正当な理由だと確信しています)。

ただし、サブタイプ配列をスーパータイプ配列にキャストできます(例:Integer[]からObject[])!

21
Sean

または、次のことを行います。

...

  Integer[] integerArray = new Integer[integerList.size()];
  integerList.toArray(integerArray);

  return integerArray;

}
14
Michael
Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

オブジェクトの配列をキャストして整数の配列にキャストしようとしています。できません。このタイプのダウンキャストは許可されていません。

整数の配列を作成し、その後、最初の配列のすべての値を2番目の配列にコピーできます。

4
Tommaso Taruffi