为什么以下代码没有警告?
public void some(Object a){
Map<?, ?> map = **(Map<?,?>)a**; //converting unknown object to map
}
Run Code Online (Sandbox Code Playgroud)
我预计RHS会有一个未经检查的警告.
虽然此代码有警告:
public void some(Object a){
Map<Object, Object> map = **(Map<Object,Object>)a**;
//converting unknown object to Map<Object,Object>
}
Run Code Online (Sandbox Code Playgroud)
此外,对于以下情况,没有警告:
String str = (String) request.getAttribute("asd") //returns Object
Run Code Online (Sandbox Code Playgroud)
这是否意味着仿制药带来了未经检查的警告?在Java中引入泛型之前没有这样的警告?
是的,未经检查的警告仅与通用类型相关.
这意味着:从Object转换为Map<T1, T2>可能成功,因为该对象确实是一个Map,但由于类型擦除,运行时无法检查它是否为a Map<T1, T2>.它很可能是一个Map<T3, T4>.因此,您可以通过在内部放置T1,T2元素来破坏映射的类型安全性,或者在尝试从映射中读取值时获取ClassCastException.
您没有对第一个强制转换的警告,因为您正在转换为a Map<?, ?>,这意味着键和值类型是未知的,这是真的.如果没有额外的强制转换,您将无法在这样的地图上执行类型不安全的操作:您无法向此类地图添加任何内容,并且您可以从中获取的唯一内容是实例Object.
您不会收到“未检查”警告,因为强制转换是完全“检查”的——强制转换Map<?,?>只需确保对象是 a Map(而不是其他),并且在运行时完全可检查。换句话说,Map<?,?>是一个可具体化的类型。