使用继承拦截 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];
}
};
}
我在 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];
}
};
}