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

时间:2014-09-02 12:09:27

标签: java android android-intent arraylist serializable

我上面提到了课程:

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);

它有效。

5 个答案:

答案 0 :(得分:8)

在内部,android会将所有额外内容放在一个特殊的Map中,并且不记录你想要它的确切分区。

在某些时候,android会将你的额外内容扁平化为包裹,它会通过检查每个对象类型来实现(因为,正如我所说,它不记得你想要它)。

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

如果你想保留类型

,那么构图优于继承

答案 1 :(得分:1)

如果intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG);返回类ArrayList<JsonHistory>的对象而不是JSONHistoryList类型的对象,则会发生这种情况。

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

考虑你的例子,比如说

public class JsonHistoryList extends ArrayList实现Serializable {    public int someField; //可以通过任何东西 }

为简单起见,如果您的getSerializableExtra();返回new ArrayList<JsonHistory>(),当您尝试将其向下转发为JsonHistoryList时,由于无法确定someField值,因此无法投放

答案 2 :(得分:0)

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

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

你可以看看这个链接。它将清除所有的疑虑 explicit casting from super class to subclass

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我遇到了与您相同的问题,我只是添加了一个实现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);
    }
}