ImmutableMap 通过 Intent 传递时变成 HashMap
-
21-12-2019 - |
题
我在 Android 项目中使用 Guava 集合。刚刚注意到以下行为:
在 Activity1
:
Intent i = new Intent(this, Activity2.class);
i.putExtra("extra1", ImmutableMap.of("key1", "value1"));
startActivity(i);
在 Activity2
:
Activity2::onCreate(...) {
ImmutableMap<String,String> map =
(ImmutableMap<String,String>)getIntent()
.getSerializableExtra("extra1");
// above line throws ClassCastException!
}
执行后,第二个片段中的代码将引发此异常:
java.lang.ClassCastException:java.util.hashmap不能施放到com.google.common.collect.immutablemap
所以在某个时刻 ImmutableMap
变成了 HashMap
。我想知道为什么会这样以及我能做些什么来避免这种情况?
附:如果我在构造/接收 Intent 后立即打印此内容以调试输出:
intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
解决方案
这 Intent
extras 被传递为 包裹, ,这是一种高性能 IPC 传输(想想高性能序列化)。打包后,你的 ImmutableMap 是 像所有 Map 实现一样编写, ,因此后来 读取为 HashMap.
我认为你无法避免这一点。如果您真的想与 ImmutableMap
, ,你需要使用 ImmutableMap.copyOf()
将 HashMap 的内容复制到 ImmutableMap 中。
Activity2::onCreate(...) {
ImmutableMap<String,String> map = ImmutableMap.copyOf(
(Map<String,String>)getIntent().getSerializableExtra("extra1")
);
}
不隶属于 StackOverflow