簡體   English   中英

將原始地圖投射到地圖 <Object, Object> ,有什么問題嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM