使用继承拦截 Parcelable 时出现 ClassCastException

ClassCastException when intercept Parcelable with inheritance

我在 Android Studio 工作,任何时候我需要 Parcelable 都可以自动生成代码。我的情况是我有 super class A 和 class B 从 class A 扩展而来。我想通过一个意图 class B 但是当我拦截它时我得到一个错误 sayng Caused by: java.lang.ClassCastException: pack.A cannot be cast to pack.B。代码是:

public class A implements Parcelable {

    private String str1;

    protected A(Parcel in) {
        str1 = in.readString();
    }

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

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

    public static final Creator<A> CREATOR = new Creator<A>() {
        @Override
        public A createFromParcel(Parcel in) {
            return new A(in);
        }

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

public class B extends A {

    private String str2;

    protected B(Parcel in) {
        super(in);
    }
}

我对这个错误感到困惑。感谢任何帮助

考虑以下场景(使用相同的 类,a 是 super,b 是 child):

你可以这样做:

A a = new B();

但是你不能这样做:

B b = new A();

当你为 B 加载 parcelable,但类型是 A 时,你基本上是这样做的(用不同的代码,但你基本上告诉机器的是):

B b = new A()

这意味着您现在无法按照您的意愿执行此操作。您必须为 B 创建一个自定义创建器,您可以在其中创建类型为 B 的 parcelable。

至于报错,是因为creator是类型A,你却转为B。和B b = new A()一样。因此,为了解决它,您必须为 B 创建一个创建者。


继承是一个有点复杂的话题,因为在什么地方可以转换方面有很多需要跟踪的东西。

正如@njzk2所说,你需要在class中声明一个新的CREATOR B:

public class B extends A {

    private String str2;

    protected B(Parcel in) {
        super(in);
        str2 = in.readString();
    }

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

    public static final Creator<B> CREATOR = new Creator<B>() {
        @Override
        public B createFromParcel(Parcel in) {
            return new B(in);
        }

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