我在一个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附加项以parcels的形式传递,这是一种高性能IPC传输(请考虑高性能串行化)。拆分后,您的ImmutableMap为written like all Map implementations,因此以后为read as a HashMap

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

Activity2::onCreate(...) {
  ImmutableMap<String,String> map = ImmutableMap.copyOf(
         (Map<String,String>)getIntent().getSerializableExtra("extra1")
  );
}

09-11 17:18