質問: new HashMap<>(); map.put("id", strs[0]); map.put("name", strs[1]); map.put("telNo", strs[2]); [エラー分] java.lang.ClassCastException: ``` オブジェクトを継承関係にないクラスにキャストしようとしたことが問題だと出てきました。 このコード的には問題ないが、クラスの継承関係が正しくないために、正しくキャストされないということでしょうか。 それともコード事態に問題があるのでしょうか。 ご教示いただけると幸いです。よろしくお願いいたします。
回答: ``` //resultDataをObject[]型にキャスト Object[] objs = resultData.toArray(new Object[resultData.size()]); ``` ここでやっていることは「キャスト」ではなく、resultDataをObjectの配列に入れている、というものです。 つまり、resultDataの中のdata(どういうクラスか不明ですが)という型のオブジェクトを、配列の中に用意されたObject型変数に次々代入しているような形です。**代入しているだけで、オブジェクトの実体の型はdata型のままです。** ``` //objsをString[]型にキャスト String[] strs = (String[])objs; ``` 上記の通り、objsはObjectの配列ですが、実行時の中身はdata型のオブジェクトです。 これをStringの配列にキャストしようとするわけですが、**中身のdataをStringにキャストできないので、例外が発生します。** そもそもここで使っているように、Javaの配列には共変性(配列の中身の型同士に継承関係があればキャストできる)があるのでコンパイルエラーにはならないのですが、このように型安全性の問題があり、Javaの失敗と言われているそうです。 というか、これだけなら配列化する必要性がないですよね。`strs[0]`としているところを、(どうしてもStringで入れるとしたら)`resultData.get(0).toString()`とすれば済む話なのでは?