閉じる

ArrayListを継承したクラスのオブジェクトの Intent経由での受け渡し

以下のコードは特に問題ないように見えるけど、実際には hogeにキャストする時点で java.lang.ClassCastException例外が発生する*1

import java.io.Serializable;
import java.util.ArrayList;

import android.content.Intent;

@SuppressWarnings("serial")
class Item implements Serializable {
}

@SuppressWarnings("serial")
class hoge extends ArrayList<Item> {
}

class temp {
void save(Intent intent, hoge o) {
intent.putExtra("HOGE", o);
}

hoge load(Intent intent) {
return (hoge) intent.getSerializableExtra("HOGE");
}
}

理由はよくわからないのだけど、getSerializableExtraで得られるのが ArrayListになってしまうようだ。

バッドノウハウな気もするけど、こういう時はラップクラスを作ってやればうまくゆく。

import java.io.Serializable;
import java.util.ArrayList;

import android.content.Intent;

@SuppressWarnings("serial")
class Item implements Serializable {
}

@SuppressWarnings("serial")
class hoge extends ArrayList<Item> {
}

class temp {
@SuppressWarnings("serial")
static class Holder implements Serializable {
private final hoge o;

Holder(hoge o_) {
o = o_;
}

hoge get() {
return o;
}
}

void save(Intent intent, hoge o) {
intent.putExtra("HOGE", new Holder(o));
}

hoge load(Intent intent) {
return ((Holder) intent.getSerializableExtra("HOGE")).get();
}
}

*1 ArrayListに限らず HashMap等でも発生し、同じ方法で対処できる。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)