第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()
)?
答案 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)
HashMap
和HashMap<k,V>
。
第一个HashMap是通用的,第二个特定于类型(Key以及值)。在第一个HashMap中,您可以将任何通用对象放在第二个特定于类型的位置。
答案 2 :(得分:1)
来自seocnd行的HashMap
(几乎)是只读的,因为通配符,你不能添加任何内容。在第一个中你可以添加所有内容,因为它由compliler翻译为:
HashMap<Object, Object> map: