ImmutableMap se transforme en HashMap lorsqu'il est transmis via Intent
-
21-12-2019 - |
Question
J'utilise des collections Guava dans un projet Android.Je viens de remarquer le comportement suivant :
Dans Activity1
:
Intent i = new Intent(this, Activity2.class);
i.putExtra("extra1", ImmutableMap.of("key1", "value1"));
startActivity(i);
Dans Activity2
:
Activity2::onCreate(...) {
ImmutableMap<String,String> map =
(ImmutableMap<String,String>)getIntent()
.getSerializableExtra("extra1");
// above line throws ClassCastException!
}
Une fois exécuté, le code du deuxième extrait lève cette exception :
java.lang.ClassCastException :java.util.HashMap ne peut pas être converti en com.google.common.collect.ImmutableMap
Donc à un moment donné ImmutableMap
se transforme en un HashMap
.Je me demande pourquoi et que puis-je faire pour éviter cela ?
P.S.Si j'imprime ceci pour déboguer la sortie juste après avoir construit/reçu une intention :
intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
La solution
Le Intent
les extras sont distribués comme colis, qui est un transport IPC hautes performances (pensez à la sérialisation hautes performances).Une fois morcelée, votre ImmutableMap est écrit comme toutes les implémentations de Map, et c'est donc plus tard lire comme un HashMap.
Je ne pense pas que vous puissiez éviter cela.Si vous voulez vraiment travailler avec un ImmutableMap
, vous devrez utiliser ImmutableMap.copyOf()
pour copier le contenu du HashMap dans un ImmutableMap.
Activity2::onCreate(...) {
ImmutableMap<String,String> map = ImmutableMap.copyOf(
(Map<String,String>)getIntent().getSerializableExtra("extra1")
);
}