这已经在 SO 上被问过几次了,但我的情况有点不同。
我有实现 Parcelable 的 A 类。A类包含一些可以打包的成员数据。它有自己的CREATOR
并实现writeToParcel()
,describeContents()
和一个接受 a 的构造函数Parcel
。
有一个类 B 是从类 A 扩展而来的。类 B 有额外的成员数据,但它们都不需要 parceled。基本上,B 类的可打包数据与 A 类相同。如果我尝试将 B 放入一个 Bundle 中,将其传递给另一个 Activity,然后再读取它,我会得到一个 ClassCastException。我想这是预期的。
经过一番反复试验,为了使 B 类可打包,我必须至少实现以下两件事:
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 扩展,并且都具有与 B 相同的问题。似乎很愚蠢的是,它们中的每一个都必须添加自己的静态CREATOR
和接受 a 的构造函数,然后Parcel
才将其传递回 A . 其他一切都是一样的。唯一使它不同的是类的名称。它首先打破了继承的目的。
例如,如果有另一个类 C 扩展 B,我需要做同样的事情:
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。