是否可以对泛型类进行打包?

2022-09-02 20:43:43

我正在尝试创建.我在实现 .是否可以创建实现的泛型类?(请注意,这是有界的,因此它也必须实现)。public class MyClass<T extends Parcelable> implements ParcelableParcelableParcelableTParcelable

我遇到了一个问题,即可 Parcelable 接口需要一个静态变量:。因此,我不能做,因为它是非静态的。public static final Parcelable.Creator<MyParcelable> CREATORpublic static final Parcelable.Creator<MyClass<T>> CREATORMyParcelable<T>

安德烈


答案 1

我在具有泛型的类上实现Parcellable时遇到了类似的问题,第一个问题与您遇到的问题相同:

因此,我不能做公共静态最终的Parceable.Creator> CREATOR,因为MyParcelable是非静态的。

第二个是读取您需要访问的可包裹对象,由于类型擦除而无法从中获取。ClassLoaderT

下面的类是我在生产中使用的类的改编,它克服了这两个问题。注意:我还没有专门测试这个类,所以如果你有任何问题,请告诉我。

public class TestModel<T extends Parcelable> implements Parcelable {

private List<T> items;
private String someField;

public List<T> items() {
    return items;
}

public void setItems(List<T> newValue) {
    items = newValue;
}

public String someField() {
    return someField;
}

public void setSomeField(String newValue) {
    someField = newValue;
}

//region: Parcelable implementation

public TestModel(Parcel in) {
    someField = in.readString();

    int size = in.readInt();
    if (size == 0) {
        items = null;
    }

    else {

        Class<?> type = (Class<?>) in.readSerializable();

        items = new ArrayList<>(size);
        in.readList(items, type.getClassLoader());
    }
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(someField);

    if (items == null || items.size() == 0)
        dest.writeInt(0);

    else {
        dest.writeInt(items.size());

        final Class<?> objectsType = items.get(0).getClass();
        dest.writeSerializable(objectsType);

        dest.writeList(items);
    }
}

public static final Parcelable.Creator<TestModel> CREATOR = new Parcelable.Creator<TestModel>() {
    public TestModel createFromParcel(Parcel in) {
        return new TestModel(in);
    }

    public TestModel[] newArray(int size) {
        return new TestModel[size];
    }
};

//endregion
}

答案 2

将通用数据成员类名写入宗地,然后将其读回以创建其类装入器。例

public class MyClass<T> implements Parcelable {
    T data;

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(data.getClass().getName());
        dest.writeParcelable((Parcelable) data, 0);
    }

    private MyClass(Parcel in) {
        final String className = in.readString();
        try {
            data = in.readParcelable(Class.forName(className).getClassLoader());
        } catch (ClassNotFoundException e) {
            Log.e("readParcelable", className, e);
        }
    }

推荐