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
¿Fue útil?

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")
  );
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top