編集:私は名前を持っていて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
ます。