[英]Casting raw Map to Map<Object, Object>, will there be any issue?
我需要将原始Map
转换为Map<string,string>
,我想我必须先将原始Map<Object,Object>
转换为Map<Object,Object>
,然后再次将其转换为Map<String,String>
。
代码段如下所示。
Map obj1 = new HashMap();
obj1.put("key1", 1);
obj1.put("key2", false);
obj1.put("key3", 3.94f);
Map<Object, Object> obj2 = obj1;
Map<String, String> obj = new HashMap<String,String>();
for (Map.Entry<Object, Object> entry: obj2.entrySet()) {
obj.put(entry.getKey().toString(), entry.getValue().toString());
}
我想它在任何情况下都可以工作,但我想听听其他人对此代码可能造成的危险(例如ClassCastException
是否有可能?)
如果您有更好的主意,也请告诉我。
-修改后的代码
Map obj1 = new HashMap();
obj1.put(2, 1);
obj1.put(true, false);
obj1.put(4.4f, 3.94f);
Map<String, String> obj = new HashMap<String,String>();
for (Object k : obj1.keySet()){
obj.put(k.toString(), obj1.get(k).toString());
}
由于原始Map条目无论如何都将包含Object的键/值,我想我不需要临时Map<Object,Object>
。 只是对每个项目进行迭代都可以很好地工作,到目前为止,我看不到任何问题。
如果您在jdk 1.4
查看了HashMap
的定义,那是较早的在没有generics
概念出现时使用Object
类的实现。
引入generics
,此object
将替换为<T>
。 但是,如果仍然不使用Generics
类型安全,则在内部此语句new HashMap()
反映<Object, Object>
的实例。 更好的方法是直接使用new HashMap()
。 不需要Map <Object, Object> obj2
。
所以,为此,..一种更好的方法。
Map obj1 = new HashMap();
obj1.put("key1", 1);
obj1.put("key2", false);
obj1.put("key3", 3.94f);
Map<Object, Object> obj2 = obj1;
Map<String, String> obj = new HashMap<String,String>();
for (Object obj_Entry : obj1.entrySet()) {
Map.Entry entry = (Map.Entry) obj_Entry; // This will Work Fine all Time.
obj.put(entry.getKey().toString(), entry.getValue().toString());
}
您的代码不会生成ClassCastExceptions
。 实际上,您在这里不进行任何投射。 您只需调用每个键/值对的toString()方法使其成为字符串即可。 只要toString()
返回您对象的有效值。 您的代码会没事的。
但是,如果obj1
包含空键或对象,则您的代码可能会产生NullPointerExceptions
obj1.put(null, "null value")
另请注意,如果toString()
方法为两个键返回相同的String
值,则可能会发生某些键冲突。 这不太可能,但有可能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.