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]にあります。