以下のコードは特に問題ないように見えるけど、実際には 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等でも発生し、同じ方法で対処できる。