简单的测试用例100%可重复。 尝试启用"不要保持活动"在开发者选项中。
1 - 在您的活动中成为会员" Vector" (或Vector的任何子类)。
2 - onSaveInstanceState使用" putSerializable"捆绑你的矢量成员
3 - 转到其他活动(例如按下按钮并打开新活动)
4 - 在新活动中,按后退按钮完成操作。
5 - 使shure从您在onCreate中收到的savedInstanceState包中获取向量。
6 - 崩溃!
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Vector
我做错了什么,还是在平台上坏了?
答案 0 :(得分:4)
在通过捆绑包时,所有列表都将重建为ArrayList。
在活动之间传输数据时,所有数据实现Serializable都将被写入字节流,并在新活动中重新创建它们。
当您调用bundle.getSerializable()时,它将使用readValue()中的android.os.Parcel来获取值。在Parcel.java的源代码中,当对象是List的子类时,它使用readArrayList()方法创建List,它不关心它是上一个活动中的Vector还是其他。
public final Object readValue(ClassLoader loader) {
int type = readInt();
switch (type) {
case VAL_STRING:
return readString();
...
case VAL_LIST:
return readArrayList(loader);
....
}
}