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()
)?
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()
它将没有"实际"差异.