为什么以下代码没有警告?
public void some(Object a){
Map<?, ?> map = **(Map<?,?>)a**; //converting unknown object to map
}
我希望RHS有一个未经检查的警告。
虽然此代码有警告:
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
这是否意味着仿制药带来了未经检查的警告?在Java中引入泛型之前没有这样的警告?
答案 0 :(得分:6)
是的,未经检查的警告仅与通用类型相关。
这意味着:从Object到Map<T1, T2>
的强制转换可能会成功,因为该对象确实是一个Map,但由于类型擦除,运行时无法检查它是否为Map<T1, T2>
。它很可能是Map<T3, T4>
。因此,您可以通过在内部放置T1,T2元素来破坏地图的类型安全性,或者在尝试从地图中读取值时获取ClassCastException。
你没有警告第一次投射,因为你正在投射到Map<?, ?>
,这意味着键和值类型是未知的,这是真的。如果没有额外的强制转换,你将无法在这样的地图上执行类型不安全的操作:你不能向这样的地图添加任何东西,你唯一可以得到的就是Object
的实例
答案 1 :(得分:1)
你没有得到“未经检查”的警告,因为演员表被完全“检查” - 对Map<?,?>
的强制转换只需要确保对象是Map
(并且没有别的),并且在运行时完全可以检查。换句话说,Map<?,?>
是一种可再生类型。