java.lang.ClassCastException: java.util.HashMap 无法转换为 java.util.TreeMap

3

我将一个TreeMap放入Intent中:

private TreeMap<Long, Long> mSelectedItems;

...

mSelectedItems = new TreeMap<Long, Long>();

...

Intent intent = new Intent();
intent.putExtra("results", mSelectedItems);

setResult(RESULT_OK, intent);

接着在调用活动中尝试读取它:

TreeMap<Long, Long> results = (TreeMap<Long, Long>)
    data.getSerializableExtra("results");

这会导致:

E/AndroidRuntime(26868): Caused by: java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.TreeMap

当然,但是既然我在代码中没有使用HashMap,而TreeMap实现了Serializable接口,这应该可以无误地运行,不是吗?为什么Android试图强制让我使用一个我没有使用的类?


1
你有没有尝试过搜索解决方案?[链接](https://dev59.com/5WzXa4cB1Zd3GeqPSEsg),[链接](https://dev59.com/WWct5IYBdhLWcg3wKqUd#12305459) - Emmanuel
实际上我搜索过了,但显然我没有使用正确的搜索词。第一个链接没有提到ClassCastException,第二个链接也没有提到任何一种Map。 - tbm
1个回答

6
Emmanuel提供的第一个链接(链接)就是你遇到的确切问题,尽管它没有明确指出该错误,但已经暗示了。
问题在于当你的TreeMap序列化时,会返回一个HashMap。这个答案已经完整地解释了这个问题,Emmanuel也提供了相应的信息。
因此,只需按照以下步骤即可解决你的问题:
TreeMap<Long, Long> results = new TreeMap<Long, Long>((HashMap<Long, Long>) getIntent().getSerializableExtra("results"));

该函数将bundle返回的HashMap填充到您的results TreeMap中。

如果这个解决了你的问题,请点赞下面提供的链接中的答案。


无论如何,这两个链接都没有在谷歌搜索中返回,也没有作为建议的可能问题出现,当我添加了这一个问题时。我已经投票支持提供的答案,因为它们解决了这个问题。 - tbm
@tbm 哦,我明白了。有时候会出现这种情况,你搜索某些东西但找不到,尽管实际上是有的。无论如何,既然解决了你的问题,请接受答案(而不是将其作为评论提及)。很高兴最终它能够解决你的问题。 - singularhum

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