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));
我有 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));