Об этом несколько раз спрашивали здесь, на SO, но мой случай немного отличается.
У меня есть класс A, который реализует Parcelable. Класс A содержит некоторые данные членов, которые могут быть разделены. Он имеет свой собственный CREATOR
и реализует writeToParcel()
, describeContents()
и конструктор, который принимает Parcel
.
Существует класс B, который является продолжением класса A. Класс B имеет дополнительные данные членов, но ни один из них не нуждается в разделении. По сути, данные класса B такие же, как у класса A. Если я попытаюсь поместить B в Bundle, передать его другому действию и прочитать обратно, я получу исключение 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
, только чтобы передать его обратно к А. Все остальное идентично. Единственное, что отличает его, это имя класса. Это превосходит цель наследования в первую очередь.
Например, если есть другой класс 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.