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!
}

2 番目のスニペットのコードが実行されると、次の例外がスローされます。

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

Intentエクストラは、高性能の IPC トランスポート (高性能のシリアライゼーションと考えてください) である parcel として渡されます分割すると、 ImmutableMap はすべての Map 実装と同様に記述されるため、後で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 に答える