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
Était-ce utile?

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")
  );
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top