ジェネリック クラスを Parcelable にしたいと考えています。
簡単そうです。タプルを簡単な例として使用すると (単なる例です。この特定のクラスについてはコメントしないでください。私の一部はライブラリから取得されます)、私が持っているものを拡張できます。
public class Pair<O1, O2> implements Serializable {
public O1 first;
public O2 second;
public Pair(O1 first, O2 second){
this.first = first;
this.second = second;
}
}
そしてこれを作ります:
public class PPair<O1 extends Parcelable, O2 extends Parcelable> extends Pair<O1, O2>
implements Serializable, Parcelable {
public O1 first;
public O2 second;
public PPair(O1 first, O2 second){
super(first, second);
}
// Parcelable stuff
public PPair(Parcel in){
super((O1)in.readParcelable(null), (O2)in.readParcelable(null));
}
@Override
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(first, flags);
dest.writeParcelable(second, flags);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public PPair createFromParcel(Parcel in) {
return new PPair(in);
}
public PPair[] newArray(int size) {
return new PPair[size];
}
};
}
ただし、 は使用できますがPPair<Uri, Uri>
、 では機能しませんPPair<String, String>
。
String クラスを Parcelable にするのを忘れた人がいます。
パーセル可能なジェネリック クラスで使用できるようにするためだけに、単純なパーセル可能性を追加して String を拡張するのはばかげているようです。同様に、他の誰かが私のクラスを使用する場合、 from パラメーター
を削除するextends Parcelable
(および内部で などに依存する) ことは悪い考えのように思えます。
クラスに String と任意の Parcelable の両方を受け入れさせ、少なくとも他のものと一緒に使用すると警告するより良い方法はありますか?instanceof