ClassCastException:配列$ ArrayListはArrayListにキャストできません

ClassCastException:Arrays $ ArrayListをArrayListにキャストできません

1. 前書き

ClassCastExceptionは、improperly cast a class from one type to another.を実行しようとしたときにJavaで発生するランタイム例外です。コードがオブジェクトを関連クラスにキャストしようとしたが、インスタンスではないことを示すためにスローされます。

Javaの例外の詳細については、hereを参照してください。

2. ClassCastExceptionの詳細

まず、簡単な例を見てみましょう。 次のコードスニペットを検討してください。

String[] strArray = new String[] { "John", "Snow" };
ArrayList strList = (ArrayList) Arrays.asList(strArray);
System.out.println("String list: " + strList);

上記のコードにより、ClassCastExceptionが発生し、Arrays.asList(strArray) の戻り値をArrayList.にキャストします。

その理由は、静的メソッドArrays.asList()List,we don’t know until runtime exactly what implementation is returnedを返しますが。 したがって、コンパイル時にコンパイラはどちらも認識できず、キャスト.を許可します

コードが実行されると、実際の実装がチェックされ、Arrays.asList()がArrays$Listを返し、ClassCastExceptionが発生することがわかります。

3. 解決

この例外を回避するために、ArrayListListとして宣言するだけです。

List strList = Arrays.asList(strArray);
System.out.println("String list: " + strList);

ただし、参照をListとして宣言することで、メソッド呼び出しによって返されるArrays$ArrayListを含め、any class that implements the List interfaceを割り当てることができます。

4. 概要

この記事では、ClassCastExceptionとは何か、そしてこの問題を修正するためにどのような対策を講じる必要があるかについて説明しました。

完全なコードはover on GitHubにあります。