为什么不能在活动之间传递List(而不是ArrayList)?

4
据我所知,在活动之间传递一个简单的List对象,除非这个List是一个ArrayList,否则是没有办法的。我是否可能错过了某种方法来实现这个目的?如果不行,有人知道为什么谷歌要强制用户在代码中使用特定的实现细节吗?

1
我不确定,但我打赌是因为对于大型数组来说,进行块内存复制比创建一个全新的数据结构(例如链表)并逐个复制每个对象要更有效率。 - Greg Giacovelli
我同意Greg的观点,他们可能已经优化了那个特定的实现。 - NG.
@RhinoFeeder 抱歉,我误读了帖子。我已删除之前的评论。 - Raghunandan
值得注意的是,正如下面另一条回复所说,你可能做错了。你考虑过使用一个应用程序范围内的列表,可以直接从程序的其他部分访问吗? - mikebabcock
2个回答

4
你可以传递显式实现,因为它们实现了Serializable,而它们的抽象和接口没有实现。
List和其他集合不是Serializable,因为这不是它们的定义。它们向其实现提供选择,因为你也有不可序列化的List实现。
这很重要,因为你可能想保存不适合序列化的数据在列表中。在这些情况下,你可以选择更适合此数据的实现,而不是被'List'强制能够序列化。

第三段对我来说真正重要的地方就在这里。那么这就有意义了。因为在Android中处理对象的方式,我们需要一个Serializable,这意味着我们需要调用List的实现? - Alex
没错。你需要实现Serializable(或者Parcable,如果是自己的对象请使用这个)才能将一个对象从Activity传递到另一个Activity,因为这不可能通过引用来实现。Serializable只在特定的实现上实现,而不是在接口/抽象类上实现。这是因为List并不总是需要被序列化。关于这两个要求的具体内容和原因,在互联网上都有详细的解释,你应该去了解一下。 - Stefan de Bruijn
听起来很棒,最后一个快速问题。这样做是否可接受/是好的实践?//Driver 实现 Parcelable List drivers; protected void onSaveInstanceState(Bundle out){ outstate.putParcelableArrayList(KEY, new ArrayList(drivers)); } - Alex
1
应该可以正常工作,但是如果你最终还是要使用实现,那么是否有必要继续使用接口“List”就不得而知了。最好从一开始就选择最佳实现并坚持使用。针对接口编程是最佳实践,但通常并不切实际。 如果你真的想出于某种原因继续使用接口,可以考虑以不同的方式在活动之间获取数据。例如,你可以将数据持久化到数据库中,并在需要时再次获取它们。 - Stefan de Bruijn

0
因为有一个Application类,你可以用它来存储诸如这样的引用和更多内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接