编辑:我有名字sharp
并且rect
很困惑,所以我交换了它们以避免混淆
您只需像这样实现它:
public static final Parcelable.Creator<Rect> CREATOR
= new Parcelable.Creator<Rect>() {
public Rect createFromParcel(Parcel in) {
return new Rect(in);
}
public Rect[] newArray(int size) {
return new Rect[size];
}
};
您没有覆盖中的字段Sharp
,因为无法覆盖静态字段。您正在隐藏该字段。这意味着如果有人写道:
Parcelable.Creator<Rect> creator = Rect.CREATOR;
他们得到的对象与有人写的不同:
Parcelable.Creator<Sharp> creator = Sharp.CREATOR;
注意:我冒昧地将您的类名Rect
和Sharp
. 你也应该这样做。它会让你的生活更轻松,你的代码看起来更像 Java ;-)
编辑:在 OP 的评论之后添加了一些额外的说明
我想我看到了你的问题。您想定义一个传递Sharp
对象的接口,但您确实想传递派生Rect
对象,并且该对象Sharp
在接收端被重新创建为对象。看起来 AIDL 不支持这种继承。但是,你可以做的是这样的(穷人的工厂):
在Rect
:
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getClass().getName());
// Write other instance variables
}
在Sharp
:
public static final Parcelable.Creator<Sharp> CREATOR
= new Parcelable.Creator<Sharp>() {
public Sharp createFromParcel(Parcel in) {
String derivedClassName = in.readString();
if (derivedClassName.equals(Rect.class.getName()) {
// Create an instance of Rect and return that
return new Rect(in);
} else if (derivedClassName.equals(...) {
// Possible other derived classes
}
}
public Sharp[] newArray(int size) {
return new Sharp[size];
}
};
注意构造函数
public Rect(Parcel in)
将使用已从传入的类名 String 中删除的调用Parcel
。