gpt4 book ai didi

java - 拦截带有继承的 Parcelable 时出现 ClassCastException

转载 作者:行者123 更新时间:2023-12-02 02:49:19 25 4
gpt4 key购买 nike

我正在 Android Studio 中工作,任何时候我需要 Parcelable 时都会自动生成代码。我的情况是,我有父类(super class) A 和从类 A 扩展的类 B。我想传递一个 Intent 类 B 但当我拦截它时,我收到一个错误 Caused by: java.lang.ClassCastException: pack.A 无法转换为 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是子级):

你可以这样做:

A a = new B();

但是你不能这样做:

B b = new A();

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

B b = new A()

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

至于错误,是因为创建者是A类型,但是你将其转换为B。这与B b = new A()相同。因此,为了解决这个问题,您必须为 B 创建一个创建者。

<小时/>

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

关于java - 拦截带有继承的 Parcelable 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com