Java 以一种有用的方式强制转换HashMap

Java 以一种有用的方式强制转换HashMap,java,generics,casting,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 // .. } if(HashMap的obj实例){ H

考虑到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
    // ..
}
if(HashMap的obj实例){
HashMap meta=(HashMap)obj;//第1行,原始类型警告
//vs
HashMap meta=(HashMap)obj;//第2行,没有警告
// ..
}

为什么有人会选择第2行(无警告,键入安全),但似乎强制转换的映射不能以有意义的方式使用(即,
put()/get()
)?

HashMap
HashMap

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

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

HashMap
HashMap

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

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

HashMap
=
HashMap
!=<代码>哈希映射

if (obj instanceof HashMap) {
    HashMap meta = (HashMap) obj; // line 1, raw-type warnings
    // vs
    HashMap<?, ?> meta = (HashMap<?, ?>) obj; // line 2, no warnings
    // ..
}
HashMap m1=newhashmap();
m1.put(“foo”、“bar”);//错误
HashMap m2=新的HashMap();
m2.放(foo,bar);//好啊
HashMap m3=新的HashMap();
m3.投入(“foo”,“bar”);//警告(应参数化)

如果只使用HashMap.get(),则不会有“实际”区别。

HashMap
=
HashMap
!=<代码>哈希映射

if (obj instanceof HashMap) {
    HashMap meta = (HashMap) obj; // line 1, raw-type warnings
    // vs
    HashMap<?, ?> meta = (HashMap<?, ?>) obj; // line 2, no warnings
    // ..
}
HashMap m1=newhashmap();
m1.put(“foo”、“bar”);//错误
HashMap m2=新的HashMap();
m2.放(foo,bar);//好啊
HashMap m3=新的HashMap();
m3.投入(“foo”,“bar”);//警告(应参数化)

如果您只打算使用
HashMap.get()
,则不会有“实际”区别。

从seocnd行出来的
HashMap
是(几乎)只读的,由于通配符的缘故,您无法向其添加任何内容。在第一种情况下,您可以添加所有内容,因为compliler将其翻译为:

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

从seocnd行出来的
HashMap
是(几乎)只读的,由于通配符的原因,您无法向其中添加任何内容。在第一种情况下,您可以添加所有内容,因为compliler将其翻译为:

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

可能重复@kocko,谢谢,但这个问题实际上回答了
HashMap vs HashMap
,仍然有用,但我对原始类型比较很好奇。在上面的代码中,你无法对第2行的map做任何有用的事情,那么为什么会有人使用它呢?可能是@kocko的副本,谢谢,但这个问题实际上回答了
HashMap vs HashMap
,仍然有用,但我对原始类型比较很好奇。在上面的代码中,您无法对第2行上的映射执行任何有用的操作,那么为什么有人会使用它?+1,但对警告进行更多的描述总是很有帮助的:)是的,-编译器将确保没有人意外地放入映射,这看起来是使用通配符提供对映射的只读访问的一个很好的理由+1并接受。+1,但关于警告的更多描述总是有用的:)是的,-编译器将确保没有人意外地放入映射,这看起来是使用通配符提供对映射的只读访问的一个很好的理由+1并接受。