Immutablemap si trasforma in un hashmap quando è passato attraverso l'intento
-
21-12-2019 - |
Domanda
Sto usando Collections Guava in un progetto Android. Ho appena notato il seguente comportamento:
in Activity1
:
Intent i = new Intent(this, Activity2.class);
i.putExtra("extra1", ImmutableMap.of("key1", "value1"));
startActivity(i);
.
in Activity2
:
Activity2::onCreate(...) {
ImmutableMap<String,String> map =
(ImmutableMap<String,String>)getIntent()
.getSerializableExtra("extra1");
// above line throws ClassCastException!
}
.
Una volta eseguito, il codice nel secondo snippet getta questa eccezione:
.java.lang.classcastexception: java.util.hashmap non può essere lanciato com.google.common.collect.immutablemap
Così a un certo punto ImmutableMap
viene trasformato in un HashMap
.
Mi chiedo perché e cosa posso fare per evitare questo?
P.S.Se lo stampa questo per eseguire il debug output subito dopo la costruzione / ricezione di un intento:
intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
. Soluzione
Gli extra Intent
sono passati in giro come parcel , che è aTrasporto IPC ad alte prestazioni (Pensare la serializzazione ad alte prestazioni).Quando ha parlato, la tua immutablemap è scritto come tuttoImplementazioni mappa , e quindi è successivamente Leggi come hashmap .
Non penso che tu possa evitarlo.Se vuoi davvero lavorare con un ImmutableMap
, è necessario utilizzare ImmutableMap.copyOf()
per copiare il contenuto di Hashmap in un immutablemap.
Activity2::onCreate(...) {
ImmutableMap<String,String> map = ImmutableMap.copyOf(
(Map<String,String>)getIntent().getSerializableExtra("extra1")
);
}
.