سؤال

أنا أستخدم مجموعات الجوافة في مشروع 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")
  );
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top