以有用的方式强制转换HashMap

时间:2013-12-05 08:25:37

标签: java generics casting

第1行和第1行的铸造之间的[实际]区别是什么?第2行,考虑到Java 6:

if (obj instanceof HashMap) {
    HashMap meta = (HashMap) obj; // line 1, raw-type warnings
    // vs
    HashMap<?, ?> meta = (HashMap<?, ?>) obj; // line 2, no warnings
    // ..
}

为什么有人会选择第2行(没有警告,类型安全),但似乎无法以有意义的方式使用转换后的地图(例如put()/get())?

3 个答案:

答案 0 :(得分:7)

HashMap = HashMap<Object, Object>!= HashMap<?, ?>

HashMap<?, ?> m1 = new HashMap<Object, Object>();
m1.put("foo", "bar");    // ERROR!!

HashMap<Object, Object> m2 = new HashMap<Object, Object>();
m2.put("foo", "bar");    // OK

HashMap m3 = new HashMap<Object, Object>();
m3.put("foo", "bar");   // WARNING (should be parameterized)

如果您只使用HashMap.get(),则不会产生“实际”差异。

答案 1 :(得分:1)

HashMapHashMap<k,V>

第一个HashMap是通用的,第二个特定于类型(Key以及值)。在第一个HashMap中,您可以将任何通用对象放在第二个特定于类型的位置。

答案 2 :(得分:1)

来自seocnd行的HashMap(几乎)是只读的,因为通配符,你不能添加任何内容。在第一个中你可以添加所有内容,因为它由compliler翻译为:

HashMap<Object, Object> map: