5

所以我想将 LinkedHashMap 传递给一个意图。

//SEND THE MAP
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class);
singlechannel.putExtra("db",shows1);//perase to
startActivity(singlechannel);

//GET THE MAP
LinkedHashMap<String,String> db = new LinkedHashMap<String,String>();   
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

这个就像 HashMap 的魅力一样。但是使用 LinkedHashMap 我遇到了一个问题,我在这里遇到了运行时错误

  db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

HashMap 没有错误。

我也收到了警告“类型安全:未经检查的从 Serializable 转换为 LinkedHashMap”但我也收到了 HashMap 的警告。任何想法。非常感谢任何帮助

我也刚看到这个。 https://issues.apache.org/jira/browse/HARMONY-6498

4

2 回答 2

4

这里问题的根源是您试图将类型转换为泛型类型。如果没有不安全/未经检查的类型转换,这将无法完成。

泛型类型的运行时类型是原始类型;即类型参数的实际类型未知的类型。在这种情况下,运行时类型将为LinkedHashMap<?, ?>. 这不能安全地进行类型转换,LinkedMashMap<String, String>因为运行时系统无法知道所有键和值实际上都是String实例。

你有两个选择:

  • 您可以添加一个注释来告诉编译器“闭嘴”关于未经检查的演员表。这有点冒险。如果由于某种原因其中一个键或值实际上不是字符串,那么您的应用程序稍后可能ClassCastException会在一个完全出乎意料的地方得到一个;例如,在迭代键或分配 a 的结果时get

  • 您可以手动将反序列化复制Map<?, ?>到一个新的LinkedMashMap<String, String>,明确地将每个键和值转换为String.

更新

显然,运行时异常的真正原因(与“不安全的类型转换”编译错误不同)是 Android 将serializedExtra意图之间的传递作为常规HashMap而不是使用Map您提供的类。此处对此进行了描述:

正如问答所解释的那样,没有简单的解决方法。如果要传递保留键顺序的映射,则必须将映射转换为对数组并传递它。另一方面,您将需要从传递的数组中重建地图。

于 2010-05-23T02:19:16.687 回答
2

LinkedHashMap 确实实现了 Map 接口,这里是源代码中的定义:

public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>

以下测试工作正常,所以我认为您遇到的问题与 LinkedHashMap 无关。

Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("1", "one");
        FileOutputStream fos = new FileOutputStream("c://map.ser");
        ObjectOutputStream out = new ObjectOutputStream(fos);
        out.writeObject(map);
        out.close();


        FileInputStream fin = new FileInputStream("c://map.ser");
        ObjectInputStream in = new ObjectInputStream(fin);
        Map<String, String> map2 = (Map<String, String>) in.readObject();
        System.out.println(map2); 
于 2010-05-23T03:05:21.743 回答