Java未经检查的操作强制转换为泛型

Java未经检查的操作强制转换为泛型,java,generics,unsafe,unchecked,Java,Generics,Unsafe,Unchecked,我想知道为什么下面会对不安全/未检查的操作发出警告: Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute"); Map sessionMap=(Map)se.getSession().getServletContext().getAttribute(“myattrib

我想知道为什么下面会对不安全/未检查的操作发出警告:

Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");
Map sessionMap=(Map)se.getSession().getServletContext().getAttribute(“myattribute”);
演员选错了吗?我不明白我在这里错过了什么

另外,我不想摆脱警告,我想了解不安全的操作


谢谢

这意味着cast将检查返回的对象是否是某种类型的
Map
,但由于类型擦除,它将无法检查其内容的任何内容。在执行时,映射是映射是映射。。。因此,如果有人将一个
Map
放到您的会话中,那么这行代码仍然会成功。只有在尝试使用其中一个条目时,才会出现错误,例如,通过迭代条目并获取键和值


欢迎来到Java泛型的古怪世界:(

这是一个未经检查的强制转换。作为程序员,您可能知道se.getSession()应该是那种类型,带有
参数,因此您正在进行强制转换,但它可能不是那种类型(编译器建议)。由于您没有按程序检查,编译器会警告您


另请参见:

JVM不会像这样检查强制转换。 例如,
(Map)se.getSession().getServletContext().getAttribute(“myattribute”);
将等于
(Map)se.getSession().getServletContext().getAttribute(“myattribute”);