[英]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.