1. 序章

ClassCastException は、あるタイプから別のタイプにクラスを不適切にキャストしようとしたときにJavaで発生するランタイム例外です。コードがオブジェクトをキャストしようとしたことを示すためにスローされます関連するクラスですが、インスタンスではありません。

Javaの例外の詳細については、こちらをご覧ください。

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. 解像度

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

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

ただし、参照を List として宣言することにより、メソッド呼び出しによって返される Arrays $ ArrayList を含め、Listインターフェイスを実装する任意のクラスを割り当てることができます。

4. 概要

この記事では、 ClassCastException とは何か、およびこの問題を修正するために必要な対策について説明しました。

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