将原始地图投射到地图<object,object =“”>,会有任何问题吗?

时间:2016-03-16 04:40:01

标签: java

我需要将原始Map转换为Map<string,string>,我认为我必须先将原始地图转换为Map<Object,Object>,然后再将其转换为Map<String,String>。< / p>

代码段如下所示。

    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,Object>。只是迭代每个项目效果很好,到目前为止我都没有看到任何问题。

2 个答案:

答案 0 :(得分:1)

如果您在HashMap中查看jdk 1.4的定义,那么在Object概念未来时,使用generics类的实现更早。

引入generics后,object替换为<T>。但是,如果您仍未使用Generics类型安全,则内部此语句new HashMap()会反映<Object, Object>的实例。更好直接使用a new HashMap()是个更好的主意。不需要Map <Object, Object> obj2

所以,GO为此......更好的方法。

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());

}

答案 1 :(得分:1)

您的代码不会生成ClassCastExceptions。其实你在这里没有做任何演员。您只需调用每个键/值对的toString()方法,使其成为一个字符串。只要toString()返回对象的有效值。你的代码没问题。

但如果您的NullPointerExceptions包含空键或对象

,则您的代码可能会生成obj1
obj1.put(null, "null value")

另请注意,如果toString()方法为两个键返回相同的String值,则可能会发生一些键冲突。这不太可能,但有可能。