これはここSOで数回尋ねられましたが、私の場合は少し異なります。
Parcelable を実装するクラス A があります。クラス A には、パーセル可能なメンバー データが含まれています。独自の、 、、および を受け入れるコンストラクターをCREATOR
実装しています。writeToParcel()
describeContents()
Parcel
クラス A から拡張されたクラス B があります。クラス B には追加のメンバー データがありますが、いずれも分割する必要はありません。基本的に、クラス B のパーセル可能なデータはクラス A と同じです。B をバンドルに入れ、それを別のアクティビティに渡して読み戻そうとすると、ClassCastException が発生します。それは予想通りだと思います。
少し試行錯誤した後、クラス B をパーセル可能にするために、少なくとも次の 2 つのことを実装する必要があります。
public static final Parcelable.Creator<B> CREATOR
= new Parcelable.Creator<B>() {
public B createFromParcel(Parcel source) {
return new B(source);
}
public B[] newArray(int size) {
return new B[size];
}
};
public B(Parcel in) throws JSONException {
super(in);
}
だから私の懸念はこれです。A から拡張された約 6 つ以上のクラスがあり、すべて B と同じ問題を抱えています。それらのそれぞれが独自の staticCREATOR
と a を受け入れるコンストラクターを追加し、Parcel
それを A に戻すだけであるというのはばかげているようです。他のすべては同じです。唯一の違いは、クラスの名前です。そもそも継承するという目的に勝っています。
たとえば、B を拡張する別のクラス C がある場合、同じことを行う必要があります。
public static final Parcelable.Creator<C> CREATOR
= new Parcelable.Creator<C>() {
public C createFromParcel(Parcel source) {
return new C(source);
}
public C[] newArray(int size) {
return new C[size];
}
};
public C(Parcel in) throws JSONException {
super(in);
}
このプロセスを自動化するためのJavaの巧妙なテクニックはありますか? おそらく、ある種のジェネリックを使用していますか?他に方法がない場合は、継承系統を削除して、各クラスに Parcelable 自体を実装するように要求することもできます。