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

时间:2011-10-18 10:48:03

标签: java generics unsafe unchecked

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

Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");

演员错了吗?我无法理解我在这里缺少的东西。

P.S。我不想摆脱警告,我想了解不安全的操作。

谢谢!

3 个答案:

答案 0 :(得分:6)

这意味着强制转换将检查返回的对象是某种Map,但由于类型擦除,它将无法检查其内容的任何内容。在执行时,地图是地图是地图......所以,如果有人将Map<Integer, String>放入您的会话中,那么该行代码仍然会成功。当您尝试使用其中一个条目时,您只会收到错误,例如通过迭代条目并获取键和值。

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

答案 1 :(得分:1)

这是一个未经检查的演员。作为程序员,您可能知道se.getSession()应该是具有<String, ProxySession>参数的精确类型,因此您正在进行转换,但它可能不是那种确切的类型(编译器建议)。由于您没有以编程方式检查它,编译器会向您发出警告。

另请参阅:How do I address unchecked cast warnings?

答案 2 :(得分:0)

JVM不检查这样的强制转换。 例如,(Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");将等于(Map) se.getSession().getServletContext().getAttribute("myattribute");