ClassCastException:配列$ ArrayListはArrayListにキャストできません
1.はじめに
ClassCastException
は、クラスをある型から別の型に不適切にキャストしようとしたときにJavaで発生する実行時例外です。 。
Javaでの例外のより詳細な紹介については、https://www.baeldung.com/java-exceptions[ここ]をご覧ください。
2. ClassCastExceptionの詳細
まず、簡単な例を見てみましょう。次のコードスニペットを検討してください。
String[]strArray = new String[]{ "John", "Snow" };
ArrayList<String> strList = (ArrayList<String>) Arrays.asList(strArray);
System.out.println("String list: " + strList);
上記のコードは
ClassCastException
を発生させ、そこで
__Arrays.asList(strArray)
の戻り値を
ArrayList.__にキャストしています。
その理由は、静的メソッド
Arrays.asList()
が
Listを返すのですが、
** 実行時までどのような実装が返されるのか正確にはわからないからです。そのため、コンパイル時には、コンパイラはどちらも認識できず、キャスト
__.
__を許可します。
コードが実行されると、実際の実装がチェックされ、
Arrays.asList
()が
Arrays $ List
を返すので、
ClassCastException
が発生します。
3.決議
この例外を避けるために、
ArrayList
を
List
として宣言するだけです。
List<String> strList = Arrays.asList(strArray);
System.out.println("String list: " + strList);
しかし、参照を
List
として宣言することで、メソッド呼び出しで返される
Arrays $ ArrayList
を含む
List
インタフェースを実装する
任意のクラスを割り当てることができます。
4.まとめ
この記事では、
ClassCastException
とはどのようなものであり、この問題を解決するためにどのような対策をとる必要があるかについて説明しました。
完全なコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[over on GitHub]にあります。