4

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

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

演员阵容错了吗?我无法理解我在这里缺少什么。

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

谢谢!

4

3 回答 3

6

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

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

于 2011-10-18T10:51:07.457 回答
1

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

另请参阅:如何解决未经检查的强制转换警告?

于 2011-10-18T10:52:31.477 回答
0

JVM doesn't check casts like this. For example, (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute"); will be equal to (Map) se.getSession().getServletContext().getAttribute("myattribute");

于 2011-10-18T10:58:50.020 回答