这个问题在 SO 上已经被问了几次,但我的情况有点不同。
我有一个实现 Parcelable 的 A 类。A 类包含一些可分拣的成员数据。它有自己的 CREATOR
并实现了 writeToParcel()
、describeContents()
和一个接受 Parcel
的构造函数。
B 类继承自 A 类。B 类有额外的成员数据,但它们都不需要被 parcelable。基本上,B 类的 parcelable 数据与 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
和接受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。