2014-09-02 58 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。你期待你自己的子类,但这不是你回来的。

相关问题