以有用的方式强制转换HashMap

kir*_*wka 1 java generics casting

考虑到Java 6,在第1行和第2行的转换之间的[实际]差异是什么?

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

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

Mic*_*tti 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)
Run Code Online (Sandbox Code Playgroud)

如果你打算只使用HashMap.get()它将没有"实际"差异.