当通过Intent传递时,ImmutableMap变成HashMap

时间:2014-06-04 13:30:45

标签: android guava android-guava

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

P.S。如果我在构造/接收Intent后立即将其打印到调试输出:

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

1 个答案:

答案 0 :(得分:1)

Intent个附加内容作为parcels传递,这是一个高性能的IPC传输(想想高性能序列化)。在parceled时,您的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")
  );
}