ArrayList无法强制转换为自定义类扩展ArrayList

我有下面提到的课程:

public class JsonHistoryList extends ArrayList 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 temp = (ArrayList) 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; ... } 

因此,如果要保留类型,请继续使用inheritance

如果intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG); 返回类ArrayList的对象,而不是JSONHistoryList类型的对象。

我们无法强制转发父对象。

比如你的例子

公共类JsonHistoryList扩展ArrayList实现Serializable {public int someField; //可以通过任何东西}

为简单起见,如果你的getSerializableExtra(); 返回, new ArrayList() ,当你试图将它向下转换为JsonHistoryList ,它无法JsonHistoryList转换,因为someField值无法确定

我们不能将超类对象强制转换为子类对象。

只有当要转换的对象通过IS-A关系时才可以进行转换。

你可以看看这个链接。它将清除所有怀疑从超类到子类的显式转换

因此,如果JsonHistoryList extends ArrayList ,那么JsonHistoryList是一个ArrayList但是ArrayList不一定是JsonHistoryList 。 你期望自己的子类,但这不是你得到的。