所以我想将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发出了这个警告。 任何想法。非常感谢任何帮助
答案 0 :(得分:4)
问题的根源在于您尝试将强制类型转换为泛型类型。如果没有不安全/未经检查的类型转换,则无法完成此操作。
泛型类型的运行时类型是原始类型;即,类型参数的实际类型未知的类型。在这种情况下,运行时类型将为LinkedHashMap<?, ?>
。这不能安全地类型转换为LinkedMashMap<String, String>
,因为运行时系统无法知道所有键和值实际上都是String
个实例。
您有两种选择:
您可以添加注释以告诉编译器“关闭”未经检查的强制转换。这有点冒险。如果由于某种原因,其中一个键或值实际上不是String,那么您的应用程序可能稍后会在一个完全出乎意料的位置获得ClassCastException
;例如迭代键或分配get
的结果。
您可以手动将反序列化的Map<?, ?>
复制到新的LinkedMashMap<String, String>
中,明确地将每个键和值投射到String
。
<强>更新强>
显然,运行时异常的真正原因(与“不安全的类型转换”编译错误不同)是Android将serializedExtra
作为常规HashMap
之间的意图传递而不是使用{{ 1}}你提供的课程。这在这里描述:
正如Q&amp; A所解释的那样,没有简单的解决方法。如果要传递保留键顺序的映射,则必须将映射转换为对数组并传递它。另一方面,您需要从传递的数组重建地图。
答案 1 :(得分: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);