次のコードの何が問題になっていますか?
Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
コードの最後の行には次のエラーがあります。
スレッド「メイン」の例外Java.lang.ClassCastException:[Ljava.lang.Object; [Ljava.lang.Integer;にキャストできません。
ロス、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;
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[]
)!
または、次のことを行います。
...
Integer[] integerArray = new Integer[integerList.size()];
integerList.toArray(integerArray);
return integerArray;
}
Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
オブジェクトの配列をキャストして整数の配列にキャストしようとしています。できません。このタイプのダウンキャストは許可されていません。
整数の配列を作成し、その後、最初の配列のすべての値を2番目の配列にコピーできます。