Java , Android: Intent 后出现 ClassCastException

Java , Android: ClassCastException after Intent

我有 class 播放列表

public class Playlist extends ArrayList<Track> implements Serializable {

    String module;
    String name, playlistId;

    public Playlist(String name) {
        super();
        this.name = name;
    }
    ...
}

我尝试将其赋予 Intent:

...
Intent intent = new Intent(this, PlaylistActivity.class);
intent.putExtra("playlist", Modul.loaded[id].getPlaylist(pId)); //Return Playlist
startActivity(intent);

当我尝试获取播放列表时:

Intent intent = getIntent();
playlist = (Playlist) intent.getSerializableExtra("playlist");

这里我得到这个错误:

Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.timia2109.nukla.Playlist

但它必须是一个播放列表,因为我将它创建为一个播放列表,并且我不会将其转换为具有 Intent 的可序列化。 我在网上没有找到解决方案,但我什么也没找到。

或者有办法做到这一点:

PlaylistActivity pa = new PlaylistActivity();
pa.setPlaylist( playlist );
//And now start this Activity

谢谢!

有一个与此相关的 old bug 现在被标记为已过时。我不知道这是否仍然是一个问题。最简单的解决方案当然是手动处理(重新)创建对象

理想情况下,首先将您的实现更改为 Parcelable 类似于我过去使用过的东西

public static class Playlist extends ArrayList<Track> implements Parcelable {

    String module;
    String name, playlistId;

    public Playlist(String name) {
        super();
        this.name = name;
    }

    protected Playlist(Parcel in) {
        module = in.readString();
        name = in.readString();
        playlistId = in.readString();
        //this line you might need to tweak & error handle, I've jsut written this from memory
        super.addAll( (Collection<? extends Track>) Arrays.asList( in.readParcelableArray(Track.class.getClassLoader() )) );
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(module);
        dest.writeString(name);
        dest.writeString(playlistId);
        dest.writeParcelableArray(toArray(new Track[size()]), flags);
    }

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

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

}

偏爱parcelable的原因是explained well here

您的收货 activity 应该能更好地处理包裹。无论您是否决定将您的对象设为 Parcelable,您都可以像下面这样自己处理游戏

public static class Playlist ... {

    public Playlist(ArrayList<Track> arrList) {
        super( arrList );
    }

    ....
}

并使用

Intent intent = getIntent();
ArrayList<Track> arrList = (ArrayList<Track>) intent.getSerializableExtra("playlist");
playlist = new Playlist(arrList);

你只需要为你拥有的额外两个字段修改它,并注意当你尝试将它写入一个意图时它可能会抱怨泛型,所以只需手动转换为 parcelable/serializable你设置额外的:

intent.putExtra("playlist", (Parcelable) Modul.loaded[id].getPlaylist(pId));