自动值包裹适配器能否应对另一个自动值类的Typed Set?

Hec*_*tor 7 android parcelable auto-value

我调查auto-value及其扩展,也就是auto-value-parcelauto-value-parcel-adapter我的Android应用程序中.

我有这些模型类: -

@AutoValue
public abstract class Xenarchaeota implements Parcelable {

    @ParcelAdapter(AmoebaTypeAdapter.class)
    public abstract Set<Amoeba> amoebas();

    public static Builder builder() {
        return new AutoValue_Xenarchaeota.Builder();
    }

    @AutoValue.Builder
    public abstract static class Builder {

        public abstract Builder setAmoebas(Set<Amoeba> value);

        public abstract Xenarchaeota build();
    }
}
Run Code Online (Sandbox Code Playgroud)

@AutoValue
public abstract class Amoeba implements Parcelable {

    public abstract String surname();

    public static Builder builder() {
        return new AutoValue_Amoeba.Builder();
    }

    @AutoValue.Builder
    public abstract static class Builder {

        public abstract Builder surname(final String value);

        public abstract Amoeba build();
    }

}
Run Code Online (Sandbox Code Playgroud)

我的类型适配器是我的问题出现的地方

class AmoebaTypeAdapter implements TypeAdapter<Set<Amoeba>> {

    @Override
    public Set<Amoeba> fromParcel(Parcel in) {
        final ArrayList<Amoeba> arrayList = new ArrayList<>();
        in.readTypedList(arrayList, Amoeba.CREATOR); // How to access the CREATOR?
        return new TreeSet<>(arrayList);
    }

    @Override
    public void toParcel(Set<Amoeba> value, Parcel dest) {
        final ArrayList<Amoeba> arrayList = new ArrayList<>(value);
        dest.writeTypedList(arrayList);
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要传递给readTypedArray的CREATOR在AutoValue_Amoeba中声明.

我的错误在哪里?误会auto-value-parcel

rha*_*ter 3

AutoValue:Parcel 扩展无法处理集合,但如果将属性转换为 a,则List无需自定义适配器即可开箱即用。如果你想把它当作一个Set你可以这样做。请记住,您可能还想缓存Set.

@AutoValue
public abstract class Xenarchaeota implements Parcelable {

    abstract List<Amoeba> amoebaList();
    public Set<Amoeba> amoebas() {
        return new TreeSet(amoebaList());
    }

    public static Builder builder() {
        return new AutoValue_Xenarchaeota.Builder();
    }

    @AutoValue.Builder
    public abstract static class Builder {

        public abstract Builder setAmoebas(Set<Amoeba> value);

        public abstract Xenarchaeota build();
    }
}
Run Code Online (Sandbox Code Playgroud)