يتحول ImmutableMap إلى HashMap عند تمريره عبر Intent
-
21-12-2019 - |
سؤال
أنا أستخدم مجموعات الجوافة في مشروع Android.لاحظت للتو السلوك التالي:
في Activity1
:
Intent i = new Intent(this, Activity2.class);
i.putExtra("extra1", ImmutableMap.of("key1", "value1"));
startActivity(i);
في Activity2
:
Activity2::onCreate(...) {
ImmutableMap<String,String> map =
(ImmutableMap<String,String>)getIntent()
.getSerializableExtra("extra1");
// above line throws ClassCastException!
}
بمجرد التنفيذ، فإن الكود الموجود في المقتطف الثاني يطرح هذا الاستثناء:
java.lang.ClassCastException:لا يمكن إلقاء java.util.hashmap إلى com.google.common.collect.immutablemap
لذلك في مرحلة ما ImmutableMap
يتحول إلى أ HashMap
.وأتساءل لماذا ذلك وماذا يمكنني أن أفعل لتجنب ذلك؟
ملاحظة.إذا قمت بطباعة هذا لتصحيح الإخراج مباشرة بعد إنشاء/تلقي النية:
intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
المحلول
ال Intent
يتم تمرير الإضافات حولها الطرود, ، وهو عبارة عن نقل IPC عالي الأداء (فكر في التسلسل عالي الأداء).عند تقسيمها، تكون ImmutableMap الخاصة بك مكتوبة مثل جميع تطبيقات الخريطة, ، وهكذا في وقت لاحق قراءة باعتبارها HashMap.
لا أعتقد أنه يمكنك تجنب هذا.إذا كنت تريد حقًا العمل مع ImmutableMap
, ، سوف تحتاج إلى استخدام ImmutableMap.copyOf()
لنسخ محتوى HashMap إلى ImmutableMap.
Activity2::onCreate(...) {
ImmutableMap<String,String> map = ImmutableMap.copyOf(
(Map<String,String>)getIntent().getSerializableExtra("extra1")
);
}