Java 为什么从对象强制转换到无界通配符集合时没有警告?
为什么下面的代码没有警告Java 为什么从对象强制转换到无界通配符集合时没有警告?,java,generics,Java,Generics,为什么下面的代码没有警告 public void some(Object a){ Map<?, ?> map = **(Map<?,?>)a**; //converting unknown object to map } 这是否意味着未经检查的警告与泛型一起出现?在Java中引入泛型之前没有此类警告?是的,未选中的警告仅与泛型类型相关 这意味着:从对象到Map的转换可能会成功,因为该对象确实是一个映射,但由于类型擦除,运行时无法检查它是否是Map。它很
public void some(Object a){
Map<?, ?> map = **(Map<?,?>)a**; //converting unknown object to map
}
这是否意味着未经检查的警告与泛型一起出现?在Java中引入泛型之前没有此类警告?是的,未选中的警告仅与泛型类型相关 这意味着:从对象到
Map
的转换可能会成功,因为该对象确实是一个映射,但由于类型擦除,运行时无法检查它是否是Map
。它很可能是一张地图
。因此,您很可能会通过将T1、T2元素放入映射中来破坏映射的类型安全性,或者在尝试从映射中读取值时获得ClassCastException
第一次强制转换没有警告,因为您正在强制转换到
映射
,这意味着键和值类型未知,这是真的。如果没有额外的强制转换,您将无法在这样的映射上执行类型不安全操作:您无法向这样的映射添加任何内容,并且您唯一可以从中得到的是对象的实例您不会得到“未选中”警告,因为强制转换已完全“选中”--转换到映射
只需要确保对象是映射
(而不是其他),并且在运行时完全可检查。换句话说,Map
是一种可修改的类型。我可能错了,但是从Map
到Map
的转换不会导致ClassCastException
?您将无法向映射添加任何内容,因为程序将崩溃。@ChetanKinger不,这就是您收到警告的原因。由于类型擦除,运行时可以检查对象是否为映射,但无法判断映射的泛型类型。不,这不会导致ClassCastException。在运行时,JVM不知道类型参数绑定到什么类型,因此JVM无法检查转换为映射是否有效-您可以轻松地转换为映射,因为JVM无法区分差异。
public void some(Object a){
Map<Object, Object> map = **(Map<Object,Object>)a**;
//converting unknown object to Map<Object,Object>
}
String str = (String) request.getAttribute("asd") //returns Object