在Android上从bundle中检索数据时发生ClassCastException

我有一些状态,我想保存一个片段的生命周期。 它在屏幕旋转时工作正常,但当进程已经被杀死并从磁盘恢复(我认为这是如何工作),我得到一个ClassCastException。 这是一些代码:

初始化:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { playlistsMap = new LinkedHashMap<Section, List<Playlist>>(); } else { playlistsMap = (LinkedHashMap<Section, List<Playlist>>) savedInstanceState.getSerializable(PLAYLISTS_MAP_KEY); } setHasOptionsMenu(true); } 

保存数据:

 @Override public void onSaveInstanceState(Bundle outState) { if (isEverySectionsLoaded()) { outState.putSerializable(PLAYLISTS_MAP_KEY, playlistsMap); } else { outState.putSerializable(PLAYLISTS_MAP_KEY, new LinkedHashMap<Section, List<Playlist>>()); } // ... } 

我在onCreate投下的exception:

 04-10 01:06:43.430 E/AndroidRuntime(28549): FATAL EXCEPTION: main 04-10 01:06:43.430 E/AndroidRuntime(28549): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydomain.android/com.mydomain.android.ui.MainActivity}: java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap 

我知道在Android上使用装更好,但我仍然不明白这是怎么发生的。

有任何想法吗?

Solutions Collecting From Web of "在Android上从bundle中检索数据时发生ClassCastException"

关于类似问题的有趣阅读可以在这里find

在intent.putExtra(EXTRA_TAG,suchObject)/ startActivity(intent)/intent.getSerializableExtra(EXTRA_TAG)之后,实现java.util.List和java.io.Serializable的任何对象都将成为ArrayList。

我敢说,对于实现可序列化和映射的任何事物都是一样的。 这个HashMap是你将返回的默认值。

围绕这个看起来像一个bug的解决scheme将类似于:

 private LinkedHashMap<Section, List<Playlist>> playlistsMap; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { playlistsMap = new LinkedHashMap<Section, List<Playlist>>(); } else { //assuming the bug returns a hashmap Map<Section, List<Playlist>> items = (Map<Section, List<Playlist>>) savedInstanceState.getSerializable(PLAYLISTS_MAP_KEY); //this way you can ensure you are working with a linkedHashMap. //for the rest off the application playlistsMap.putAll(items); } setHasOptionsMenu(true); } 

上面的代码没有testing,但应该工作。 由于接口的使用,错误得到修复时,此代码仍然可以工作。 所以你可以放心,当你的客户端得到一个android更新时,你的代码仍然应该做同样的事情,而不是崩溃,并抱怨说你不能将一个HashMap转换成一个LinkedHashMap。

问题是返回的引用不是对LinkedHashMap实例的引用。 如果函数返回LinkedHashMap只返回一个LinkedHashMap ,则不能将其转换为HashMap。