2014-09-02 107 views
3

下面我所提到的類:ArrayList中不能轉換爲自定義類擴展的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); 

和它的工作。

+0

嘗試清潔您的項目,然後重新運行它組成。 – 2014-09-02 12:12:58

+0

什麼是活動?你確定是'JsonHistoryList'嗎? – user902383 2014-09-02 12:13:01

+0

請打印'temp.getClass()。toString()'並告訴我們它是什麼。 – 2014-09-02 12:13:24

回答

7

在內部,Android將每一個額外的東西放在一個特殊的地圖上,並沒有記錄你想要的東西如何分配。

在某些時候,android會將你的額外部分變成包裹,並且它會通過檢查每個對象類型來做到這一點(因爲正如我所說的,它不記得你想如何)。

地塊同時支持寫列表和writeSerializable和你JsonHistoryList還兼有(serializables的列表和serialisable本身)

因此Android瓜分是這樣的:

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; 
    ... 
} 

這麼過來的情況下,繼承要保留類型

+0

你知道Parcelable是否在這個類型清單中的List之上嗎?如果可以的話,我寧願讓我的類繼承ArrayList! – rythos42 2016-08-09 19:25:04

+0

這只是救了我。謝謝 – Jtvd78 2016-10-28 02:27:54

1

如果intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG);返回類ArrayList<JsonHistory>的對象而不是JSONHistoryList類型的對象,則會發生這種情況。

我們不能強制downcast父對象。

考慮您的例子,說

公共類JsonHistoryList擴展的ArrayList實現Serializable { 公衆詮釋someField; //可以通過任何 }

爲了簡單,如果你的getSerializableExtra();回報,new ArrayList<JsonHistory>(),當你嘗試將其降級爲JsonHistoryList,它不能投射,因爲someField值無法確定

+0

但爲什麼intent.getSerializableExtra();返回ArrayList而不是JsonHistoryList? – Averus 2014-09-02 12:30:50

+0

我認爲你的'活動'的類型是'ArrayList ',這就是爲什麼它在兩個文件中返回一個'ArrayList' – Anoop 2014-09-02 12:34:13

+0

:private JsonHistoryList activities;首先是活動和第二個服務 – Averus 2014-09-02 13:16:43

0

所以,如果JsonHistoryList extends ArrayList,那麼JsonHistoryListArrayList而是ArrayList不一定是JsonHistoryList。你期待你自己的子類,但這不是你回來的。