- PR -

Castのエラー

投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-30 11:12
エラーの概観を説明すると、Mapにputしたデータの型と
取り出すときのデータの型が違うのですね。

コード:
Map map = new HashMap();
map.put("test", new Integer(3)); // <- Integer型をput
String str = (String) map.get("test"); // <- Integerが帰ってくるのに
                                       //String型として扱おうとしている



MapをListに入れているようなので元のMapに何をputしたのか
わかりにくくなっているかもしれませんが、
型を確認しながらソースを追いかけましょう。

引用:

Listの中身は下記のような感じです。
List=[{no=11111111, flg=0, name=taro},{no=222222222, flg=0, name=hanako}]


ということから考えると、

・Listのインデックス0のMapの中身
  キー:"no"、値:Integer型 11111111
  キー:"flg"、値:Integer型 0
  キー:"name"、値:String型 "taro"
となっているのではないでしょうか。

通常、Mapにデータを入れるときはデータ型を混在させないようにします。
今回のような用途ではMapを用いるのではなく、クラスを定義するべきです。

コード:
public class Test {
    public static void main(String[] args) {
        List list = new ArrayList();
        User user1 = new User();
        user1.no = 11111111;
        user1.flg = 0;
        user1.name = "taro";
        list.add(user1);

        User user2 = new User();
        user2.no = 22222222;
        user2.flg = 0;
        user2.name = "hanako";
        list.add(user2);

        for (int i=0; i<list.size(); i++) {
            User user = (User) list.get(i);
        }
    }

    public static class User {
        int no;
        int flg;
        String name;
    }
}

小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-01-30 13:00
拝見すると、nagiseさんの書かれた通りで、設定した物と取り出した時の
キャストクラスが異なるのが問題だと思うんですが、とりあえずキャスト
エラーを出さずに済ませる安直な方法としては、
コード:
String name = map.get("name").toString(); 


というのもありますが、あまり薦められる方法では無いです。

J2SE 5.0以降が使える環境でしたら、Generics機能で
コード:
Map<String,String> map = new HashMap<String,String>();


というような書き方をすると、Integerクラスは設定できないマップを
定義することもできますよ。


スキルアップ/キャリアアップ(JOB@IT)