【问题标题】:java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList in Parcelable objectjava.util.Arrays$ArrayList 不能转换为 Parcelable 对象中的 java.util.ArrayList
【发布时间】:2023-03-26 17:51:01
【问题描述】:

我编写了以下类:

public class Company implements Parcelable {

private int uid;
@SerializedName("field_user_org_name_value")
private String name;
@SerializedName("field_user_org_address_value")
private String address;
@SerializedName("field_user_org_category_tid")
private int category;
@SerializedName("field_user_org_town_tid")
private int cityId;
@SerializedName("image")
private String imageUrl;
private int online;
@SerializedName("field_user_org_description_value")
private String description;
@SerializedName("field_user_org_phone_value")
private String mobPhone;
@SerializedName("field_user_org_stac_phone_value")
private String phone;

public ArrayList<Queue> getQueues() {
    return queues;
}

@SerializedName("value_array")
private ArrayList<Queue> queues;

double lat;
double lng = 0;
double distance;


public double getDistance() {
    return distance;
}

public void setDistance(double distance) {
    this.distance = distance;
}

public double getLng() {
    return lng;
}

public void setLng(double lng) {
    this.lng = lng;
}

public double getLat() {
    return lat;
}

public void setLat(double lat) {
    this.lat = lat;
}

public String getDescription() {
    return description;
}

public String getMobPhone() {
    return mobPhone;
}

public String getPhone() {
    return phone;
}

public int getOnline() {
    return online;
}

public Company(Parcel in) {
    uid = in.readInt();
    name = in.readString();
    address = in.readString();
    category = in.readInt();
    cityId = in.readInt();
    imageUrl = in.readString();
    online = in.readInt();
    description = in.readString();
    mobPhone = in.readString();
    phone = in.readString();
    lat = in.readDouble();
    lng = in.readDouble();
    distance = in.readDouble();
    Parcelable[] parcelableArray = in.readParcelableArray(Queues.class.getClassLoader());
    Queue[] resultArray = null;
    if (parcelableArray != null) {
        resultArray = Arrays.copyOf(parcelableArray, parcelableArray.length, Queue[].class);
    }
    queues =(ArrayList)  Arrays.asList(resultArray);
}

public int getUid() {
    return uid;
}

public String getName() {
    return name;
}

public String getAddress() {
    return address;
}

public int getCategory() {
    return category;
}

public int getCityId() {
    return cityId;
}

public String getImageUrl() {
    return imageUrl;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(uid);
    dest.writeString(name);
    dest.writeString(address);
    dest.writeInt(category);
    dest.writeInt(cityId);
    dest.writeString(imageUrl);
    dest.writeInt(online);
    dest.writeString(description);
    dest.writeString(mobPhone);
    dest.writeString(phone);
    dest.writeDouble(lat);
    dest.writeDouble(lng);
    dest.writeDouble(distance);
    Queue[] queueArray = new Queue[queues.size()];
    dest.writeParcelableArray(queues.toArray(queueArray), 0);
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

    @Override
    public Object createFromParcel(Parcel source) {
        return new Company(source);
    }

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


public static class CustomComparator implements Comparator<Company> {
    @Override
    public int compare(Company o1, Company o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

public static class CustomComparatorDistance implements Comparator<Company> {
    @Override
    public int compare(Company o1, Company o2) {
        return Double.compare(o1.getDistance(), o2.getDistance());
    }
}

public static class Queue implements Parcelable {
    public int getCondition() {
        return condition;
    }

    public String getTime() {
        return time;
    }

    /**
     * 0 - Free
     * 1 - Busy
     * 2 - Not working
     */
    @SerializedName("sel")
    int condition;
    String time;

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

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

    public Queue(Parcel in) {

        condition = in.readInt();
        time = in.readString();
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public Object createFromParcel(Parcel in) {
            return new Queue(in);
        }

        public Object[] newArray(int size) {
            return new Queue[size];
        }
    };
}
}

当我想将对象存储到另一个片段时,我遇到了这个异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{khuta.freeturn/khuta.freeturn.fragments.CompanyInfoActivity}: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
        at khuta.freeturn.models.Company.<init>(Company.java:106)
        at khuta.freeturn.models.Company$1.createFromParcel(Company.java:161)
        at android.os.Parcel.readParcelable(Parcel.java:2104)
        at android.os.Parcel.readValue(Parcel.java:2013)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        at android.os.Bundle.unparcel(Bundle.java:249)
        at android.os.Bundle.getParcelable(Bundle.java:1206)
        at android.content.Intent.getParcelableExtra(Intent.java:4652)
        at khuta.freeturn.fragments.CompanyInfoActivity.onCreate(CompanyInfoActivity.java:77)
        at android.app.Activity.performCreate(Activity.java:5231)

我已阅读casting Arrays.asList causing exception: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList,但它对我没有帮助。我很乐意得到任何帮助

这一行出错

 queues =(ArrayList)  Arrays.asList(resultArray);

【问题讨论】:

  • Queue 不是Parcelable
  • 公共静态类Queue实现Parcelable
  • 那么Queue 是您自己的课程之一吗?不是java.util.Queue
  • 是的,请看我的代码
  • 啊,错过了底层。

标签: android arrays list arraylist parcelable


【解决方案1】:

您需要将字段类型queue 更改为List&lt;Queue&gt; 而不是ArrayList&lt;Queue&gt;。你也需要改变

queues = (ArrayList)  Arrays.asList(resultArray);

queues = (List<Queue>)  Arrays.asList(resultArray);

它失败的原因是Arrays.asList() 返回一个List,但不一定是ArrayList。您不知道将返回的确切类型,因此您只需转换为 List

但是List 是一个泛型类型,所以你应该包含类型参数,并将其转换为List&lt;Queue&gt; 而不仅仅是List。 (如果您只使用List,则会收到编译器警告。)

顺便说一句,避免标准 JDK 类也使用的类名(如 Queue)通常是个好主意。这会让任何阅读您的代码的人感到困惑,并且您更有可能在某些时候不小心使用错误的import

【讨论】:

  • 或者queues = new ArrayList&lt;Queue&gt;(Arrays.asList(resultArray));
  • @kcoppock 可以,但除非你真的需要它成为ArrayList,否则这只会减慢速度。
  • 同意! :) 只是一种选择。
猜你喜欢
  • 2014-03-16
  • 2015-03-13
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2020-12-20
  • 2023-03-29
  • 2013-07-11
  • 2018-02-09
相关资源
最近更新 更多