ImmutableMap se transforma em um HashMap quando passou através da Intenção
-
21-12-2019 - |
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
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")
);
}