Search code examples
androidgenericsparcelable

Parcable of generic array


I generate parcelable implementation with plugin and that is the code i got.
I have a an error compilation on Metrics(Parcel in).
It probably because the generic array. How can i fix it?
The generic T can can contain String, Number or boolean only.

public class Metrics<T extends Parcelable> implements Parcelable {
    private T[] yData;

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

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

    public Metrics() {
    }

    protected Metrics(Parcel in) {
        this.yData = in.createTypedArray(T.CREATOR);
    }

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

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

Solution

  • You can use a List instead of an array :

    public class Metrics<T extends Parcelable> implements Parcelable {
    
        private List<T> yData;
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
    
            if (yData == null || yData.size() == 0)
                dest.writeInt(0);
            else {
                dest.writeInt(yData.size());
                final Class<?> objectsType = yData.get(0).getClass();
                dest.writeSerializable(objectsType);
                dest.writeList(yData);
            }
        }
    
        public Metrics() {
        }
    
        protected Metrics(Parcel in) {
    
            int size = in.readInt();
            if (size == 0) {
                yData = null;
            } else {
                Class<?> type = (Class<?>) in.readSerializable();
                yData = new ArrayList<>(size);
                in.readList(yData, type.getClassLoader());
            }
        }
    
        public static final Parcelable.Creator<Metrics> CREATOR = new Parcelable.Creator<Metrics>() {
            @Override
            public Metrics createFromParcel(Parcel source) {
                return new Metrics(source);
            }
    
            @Override
            public Metrics[] newArray(int size) {
                return new Metrics[size];
            }
        };
    }