2

我在一个 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. 我想知道为什么会这样,我该怎么做才能避免这种情况?

PS如果我在构建/接收意图后立即打印它以调试输出:

intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
4

1 回答 1

1

extras 作为parcelsIntent传递,这是一种高性能 IPC 传输(想想高性能序列化)。打包后,您的 ImmutableMap就像所有 Map implementations 一样编写,因此稍后将其读取为 HashMap

我认为你无法避免这种情况。如果您真的想使用ImmutableMap,则需要使用ImmutableMap.copyOf()将 HashMap 的内容复制到 ImmutableMap 中。

Activity2::onCreate(...) {
  ImmutableMap<String,String> map = ImmutableMap.copyOf(
         (Map<String,String>)getIntent().getSerializableExtra("extra1")
  );
}
于 2014-06-05T16:58:06.207 回答