Parcelable - 无法从参数化类型中进行选择

时间:2017-01-30 16:28:00

标签: android parcelable

在我的应用程序中,我有一个类,其中包含一个列表列表,我想对特定类进行Parcelable到目前为止我已尝试过

public class FeaturesParcelable implements Parcelable {
    private List<List<SpinnerModel>> featuresSublist;

    public List<List<SpinnerModel>> getFeaturesSublist() {
        return featuresSublist;
    }

    public void setFeaturesSublist(List<List<SpinnerModel>> featuresSublist) {
        this.featuresSublist = featuresSublist;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(this.featuresSublist);
    }

    public FeaturesParcelable() {
    }

    protected FeaturesParcelable(Parcel in) {
        this.featuresSublist = new ArrayList<List<SpinnerModel>>();
        in.readList(this.featuresSublist, List<SpinnerModel>.class.getClassLoader());
    }

    public static final Parcelable.Creator<FeaturesParcelable> CREATOR = new Parcelable.Creator<FeaturesParcelable>() {
        @Override
        public FeaturesParcelable createFromParcel(Parcel source) {
            return new FeaturesParcelable(source);
        }

        @Override
        public FeaturesParcelable[] newArray(int size) {
            return new FeaturesParcelable[size];
        }
    };
}

但我收到错误无法从

中的参数化类型中进行选择
protected FeaturesParcelable(Parcel in) {
        this.featuresSublist = new ArrayList<List<SpinnerModel>>();
        in.readList(this.featuresSublist, List<SpinnerModel>.class.getClassLoader());
    }

1 个答案:

答案 0 :(得分:1)

1)List<SpinnerModel>.class无法解决您所期望的事情。 Java使用generic type erasure,因此该语句的运行时类型为Class<List<?>>。这不足以确定List的合适实现或列表元素的类型。

2)即使您克服了初始难度(例如,将List替换为ArrayList并手动反序列化嵌套列表),您应该知道,List<SpinnerModel>.class.getClassLoader()会返回 system ClassLoader 。 System ClassLoader是硬编码的,只能加载Android框架类;为了反序列化在应用程序中声明的类,使用分配给它们的ClassLoader:SpinnerModel.class.getClassLoader()