ImmutableMap se convierte en un HashMap cuando pasa por Intent
-
21-12-2019 - |
Pregunta
Estoy usando colecciones de Guava en un proyecto de Android.Acabo de notar el siguiente comportamiento:
En Activity1
:
Intent i = new Intent(this, Activity2.class);
i.putExtra("extra1", ImmutableMap.of("key1", "value1"));
startActivity(i);
En Activity2
:
Activity2::onCreate(...) {
ImmutableMap<String,String> map =
(ImmutableMap<String,String>)getIntent()
.getSerializableExtra("extra1");
// above line throws ClassCastException!
}
Una vez ejecutado, el código del segundo fragmento genera esta excepción:
java.lang.ClassCastException:java.util.hashmap no puede ser lanzado a com.google.common.collect.immutableMap
Entonces en algún momento ImmutableMap
se convierte en un HashMap
.Me pregunto por qué es eso y qué puedo hacer para evitarlo.
PDSi imprimo esto para depurar la salida justo después de construir/recibir una intención:
intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
Solución
El Intent
los extras se pasan como paquetes, que es un transporte IPC de alto rendimiento (piense en la serialización de alto rendimiento).Cuando está parcelado, su ImmutableMap es escrito como todas las implementaciones de mapas, y así es más tarde leer como un HashMap.
No creo que puedas evitar esto.Si realmente quieres trabajar con un ImmutableMap
, necesitarías usar ImmutableMap.copyOf()
para copiar el contenido del HashMap en un ImmutableMap.
Activity2::onCreate(...) {
ImmutableMap<String,String> map = ImmutableMap.copyOf(
(Map<String,String>)getIntent().getSerializableExtra("extra1")
);
}