[英]ArrayList cannot be cast to custom class extending ArrayList
我有下面提到的课程:
public class JsonHistoryList extends ArrayList<JsonHistory> implements Serializable{}
我希望通过意图使用它
timerService.putExtra(TimerService.ACTIVITY_LIST_ARG, activities);
但在我收到它之后(下面的方式)
JsonHistoryList temp = (JsonHistoryList) intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG);
在我的服务中它给了我例外:
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.epstim.captime.jsonmodel.JsonHistoryList
我不明白为什么java无法处理该操作。
我已将服务代码更改为:
ArrayList<JsonHistory> temp = (ArrayList<JsonHistory>) intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG);
activities.addAll(temp);
它奏效了。
在内部,android将所有额外内容放在一个特殊的Map中,并且不记录你想要它的确切分区。
在某些时候,android会将你的额外内容扁平化为parcel,它会通过检查每个对象类型来实现(因为,正如我所说,它不记得你想要它)。
Parcel支持writeList和writeSerializable,您的JsonHistoryList也是(可序列化列表和可序列化本身)
所以android parcelling是这样的:
for (Object object : extras) {
//... check for other types here
} else if (object instanceof List) {
parcel.writeList(object); // This what happens in your case and will be unparcelled into arraylist
} else if (object instanceof Serializable) {
parcel.writeSerializable(object); // What you really want, but percelling never will get here
}
}
如果你想保留列表,你需要创建一个可序列化的类,不会扩展arraylist但会包含它。
public class SuperJsonHistory implements Serializable {
private JsonHistoryList yourList;
...
}
因此,如果要保留类型,请继承组合
如果intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG);
返回类ArrayList<JsonHistory>
的对象,而不是JSONHistoryList
类型的对象。
我们无法强制转发父对象。
比如你的例子
公共类JsonHistoryList扩展ArrayList实现Serializable {public int someField; //可以通过任何东西}
为简单起见,如果你的getSerializableExtra();
返回, new ArrayList<JsonHistory>()
,当你试图将它向下转换为JsonHistoryList
,它无法JsonHistoryList
转换,因为someField
值无法确定
因此,如果JsonHistoryList extends ArrayList
,那么JsonHistoryList
是一个ArrayList
但是ArrayList
不一定是JsonHistoryList
。 你期望自己的子类,但这不是你得到的。
我遇到了和你一样的问题,我只是添加一个实现Serializable的包装类:
public class JsonHistoryListWrapper implement Serializable {
JsonHistoryList jsonHistoryList;
private JsonHistoryListWrapper(JsonHistoryList jsonHistoryList) {
this.jsonHistoryList = jsonHistoryList;
}
public static JsonHistoryListWrapper wrapper(JsonHistoryList jsonHistoryList) {
return new JsonHistoryListWrapper(jsonHistoryList);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.