所以我想将 LinkedHashMap 传递给一个 Intent 。
//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 也有这个警告。 任何想法。非常感谢任何帮助
最佳答案
这里问题的根源在于您试图将类型转换为通用类型。如果没有不安全/未经检查的类型转换,这是无法完成的。
泛型类型的运行时类型是原始类型;即类型参数的实际类型未知的类型。在这种情况下,运行时类型将为 LinkedHashMap<?, ?>
.这不能安全地类型转换为 LinkedMashMap<String, String>
因为运行时系统无法知道所有键和值实际上都是 String
实例。
你有两个选择:
您可以添加注释来告诉编译器“闭嘴”有关未经检查的转换。这有点冒险。如果由于某种原因其中一个键或值实际上不是字符串,您的应用程序可能稍后会得到一个
ClassCastException
在一个完全意想不到的地方;例如在迭代键或分配get
的结果时.您可以手动复制反序列化的
Map<?, ?>
进入一个新的LinkedMashMap<String, String>
, 将每个键和值显式转换为String
.
更新
显然,运行时异常的真正原因(与“不安全类型转换”编译错误不同)是 Android 正在传递 serializedExtra
作为常规的 Intent 之间 HashMap
而不是使用 Map
您提供的类(class)。此处对此进行了描述:
正如该问答中所解释的那样,没有简单的解决方法。如果您想传递保留键顺序的 map ,则必须将 map 转换为对数组并传递它。在另一端,您需要根据传递的数组重建 map 。
关于java - 序列化/反序列化 LinkedHashMap (android) java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890346/