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
.

È stato utile?

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")
  );
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top