【问题标题】:Parcable of generic array泛型数组的解析
【发布时间】:2016-07-14 22:11:40
【问题描述】:

我使用插件生成可打包的实现,这就是我得到的代码。
我在Metrics(Parcel in) 上有一个错误编译。
这可能是因为泛型数组。我该如何解决?
泛型 T 只能包含字符串、数字或布尔值。

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];
        }
    };
}

【问题讨论】:

    标签: android generics parcelable


    【解决方案1】:

    您可以使用List 代替数组:

    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];
            }
        };
    }
    

    【讨论】:

    • 我知道,但我想要数组。数组可以吗?还是唯一的方法是列表?
    猜你喜欢
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多