java - 为什么系统会自动将我的 LinkedHashMap 转换为 HashMap,同时将其作为可序列化的 Intent 传递?

标签 java android android-intent classcastexception linkedhashmap

我正在获取

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap

LinkedHashMap<String, String> dataHashMap = (LinkedHashMap<String, String>) intent.getSerializableExtra("tests.test.MyApp.A.EXTRA_KEY");在 Activity B 的给定(相关部分)代码中。


  1. 在 fragment A 中,我进行了以下检查:

    Log.i(TAG, "THE TYPE OF THE MAP RETURNED FROM populateSelectedEntryList(selectedResultEntry) IS " + 
    populateSelectedEntryList(selectedResultEntry).getClass().getSimpleName()
    + ".");//******PRINTS LinkedHashMap**********************
    

打印LinkedHashMap

  • 在 Activity B 中,我进行了以下检查:

    LinkedHashMap<String, String> dataHashMap = (LinkedHashMap<String, String>)intent.getSerializableExtra("tests.test.MyApp.A.EXTRA_KEY");//**********ClassCastException*****************
    

    打印HashMap


  • 问题是为什么?为什么系统将我的 LinkedHashMap 转换为 HashMap。当 LinkedHashMap 作为可序列化的 Intent 传递时,如何强制 LinkedHashMap 继续成为 LinkedHashMap?

    代码的相关部分:

    在 fragment A 中,

    public class A extends Fragment {
      ...
    
      public void onListItemClick(...) { 
        Intent intent = new Intent(getActivity(), B.class);
        ...
        intent.putExtra("tests.test.MyApp.A.EXTRA_KEY", populateSelectedEntryList(selectedResultEntry));
        Log.i(TAG, "THE TYPE OF THE MAP RETURNED FROM populateSelectedEntryList(selectedResultEntry) IS "
     + populateSelectedEntryList(selectedResultEntry).getClass().getSimpleName() + ".");//******PRINTS LinkedHashMap**********************
        startActivity(intent);
      };
    
      ...
    
      private LinkedHashMap<String, String> populateSelectedEntryList(MyParser.Entry selectedResultEntry) {
        LinkedHashMap<String, String> selectedEntryMap = new LinkedHashMap<>();
        ...
        return selectedEntryMap;
      }
    }
    

    在 Activity B 中,

    public class B extends FragmentActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            ...
            Intent intent = getIntent();
            LinkedHashMap<String, String> dataHashMap = (LinkedHashMap<String, String>) intent.getSerializableExtra("tests.test.MyApp.A.EXTRA_KEY");
      } //**********ClassCastException*****************
      ...
    }
    

    最佳答案

    对此的解释如下:LinkedList put into Intent extra gets recast to ArrayList when retrieving in next activity

    如果你想恢复一个LinkedList,或者一个Map,其中键的顺序并不重要,你可以使用@schtever的解决方案。如果您想要恢复 LinkedHashMapTreeMap 并且键的顺序很重要,那就有点棘手了。

    一种可能的解决方案是将 Map 转换为一对 List,如下所示:

    Activity 1:

    public class Activity1 extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            Map<Integer, String> map = new LinkedHashMap<Integer, String>();
            map.put(1, "ONE");
            map.put(2, "TWO");
            map.put(3, "THREE");
    
            ArrayList<Integer> keys = new ArrayList<Integer>();
            ArrayList<String> values = new ArrayList<String>();
            for (Map.Entry<Integer, String> entry : map.entrySet()) {
                keys.add(entry.getKey());
                values.add(entry.getValue());
            }
    
            Intent intent = new Intent(this, Activity2.class);
            intent.putExtra("KEYS", keys);
            intent.putExtra("VALUES", values);
    
            startActivity(intent);
        }
    }
    

    Activity 2:

    public class Activity2 extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            Intent intent = getIntent();
            List<Integer> keys = (List<Integer>) intent.getSerializableExtra("KEYS");
            List<String> values = (List<String>) intent.getSerializableExtra("VALUES");
    
            Map<Integer, String> map = new LinkedHashMap<Integer, String>();
            for (int i = 0, n = keys.size(); i < n; i++)
                map.put(keys.get(i), values.get(i));
    
            Log.i("Activity2",  "" + map);
        }
    }
    

    这有点像黑客,而且非常冗长,但它确实有效。我很想知道是否有更好的解决方案。

    关于java - 为什么系统会自动将我的 LinkedHashMap 转换为 HashMap,同时将其作为可序列化的 Intent 传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763511/

    相关文章:

    java - 了解Spring框架和MVC的流程

    java - 我们在我们的产品中使用Java Applet 技术。是否有其他供应商提供的 Oracle Java Web 插件的替代方案?

    java - Spring Hibernate项目中使用Dozer有什么好处?

    android - 如何在 Android 上扩展日历?

    Android - 尝试发送电子邮件时出现错误 "no application can perform this action"?

    java程序无法读取字符串

    java - 带有列表 fragment 的 fragment 交易

    java - 安卓转接电话

    android - 是否可以在不返回应用程序的情况下裁剪从 Android 上的相机捕获的图像?

    Android Activity 导航,返回上一个 Activity 并返回 'exit'