Pergunta

Eu estou usando Goiaba coleções em um projeto Android.Só notei o seguinte comportamento:

No Activity1:

Intent i = new Intent(this, Activity2.class);
i.putExtra("extra1", ImmutableMap.of("key1", "value1"));
startActivity(i);

No Activity2:

Activity2::onCreate(...) {
  ImmutableMap<String,String> map = 
         (ImmutableMap<String,String>)getIntent()
              .getSerializableExtra("extra1");
  // above line throws ClassCastException!
}

Uma vez executado, o código no segundo fragmento de lança essa exceção:

o java.lang.ClassCastException:o java.util.HashMap não pode ser convertido para com.o google.comum.coletar.ImmutableMap

Então, em algum ponto ImmutableMap obtém se transformou em um HashMap.Eu me pergunto por que é que, e o que posso fazer para evitar isso?

P. S.Se eu imprimir esta a saída de depuração para a direita depois de construir/recebimento de uma Intenção:

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

Solução

O Intent os extras são transmitidos como encomendas, que é uma alta performance IPC de transporte (pensar alto desempenho serialização).Quando dividida, seu ImmutableMap é escrito como todas as implementações Mapa, e , portanto, é posterior leia como um HashMap.

Eu não acho que você pode evitar isso.Se você realmente deseja trabalhar com um ImmutableMap, você precisaria usar ImmutableMap.copyOf() para copiar o HashMap do conteúdo de uma ImmutableMap.

Activity2::onCreate(...) {
  ImmutableMap<String,String> map = ImmutableMap.copyOf(
         (Map<String,String>)getIntent().getSerializableExtra("extra1")
  );
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top