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