Frage

Ich verwende Guavensammlungen in einem Android-Projekt.Habe gerade folgendes Verhalten bemerkt:

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!
}

Nach der Ausführung löst Code im zweiten Snippet diese Ausnahme aus:

Java.lang.ClassCastException:Java.util.HashMap kann nicht in umgewandelt werden kom.Google.gemeinsam.sammeln.Unveränderliche Karte

Also irgendwann ImmutableMap verwandelt sich in eine HashMap.Ich frage mich, warum das so ist und was kann ich tun, um das zu vermeiden?

PS.Wenn ich dies drucke, um die Ausgabe direkt nach dem Erstellen / Empfangen einer Absicht zu debuggen:

intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
War es hilfreich?

Lösung

Der Intent extras werden herumgereicht als Paket, was ein Hochleistungs-IPC-Transport ist (denken Sie an Hochleistungs-Serialisierung).Im parzellierten Zustand ist Ihre unveränderliche Karte geschrieben wie alle Kartenimplementierungen, und so ist es später als HashMap lesen.

Ich glaube nicht, dass du das vermeiden kannst.Wenn Sie wirklich mit einem arbeiten möchten ImmutableMap, müssten Sie verwenden ImmutableMap.copyOf() so kopieren Sie den Inhalt der HashMap in eine unveränderliche Map.

Activity2::onCreate(...) {
  ImmutableMap<String,String> map = ImmutableMap.copyOf(
         (Map<String,String>)getIntent().getSerializableExtra("extra1")
  );
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top