簡體   English   中英

ArrayList無法強制轉換為自定義類擴展ArrayList

[英]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值無法確定

我們不能將超類對象強制轉換為子類對象。

只有當要轉換的對象通過IS-A關系時才可以進行轉換。

你可以看看這個鏈接。它將清除所有懷疑從超類到子類的顯式轉換

因此,如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM