Java 以一种有用的方式强制转换HashMap
考虑到Java 6,此处第1行和第2行的铸造[实际]区别是什么: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
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并接受。