【问题标题】:Java unchecked operation cast to genericJava 未经检查的操作强制转换为泛型
【发布时间】:2011-10-18 10:48:02
【问题描述】:
我想知道为什么以下会发出有关不安全/未经检查的操作的警告:
Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");
演员表错了吗?我无法理解我在这里缺少什么。
附:我不想摆脱警告,我想了解不安全的操作。
谢谢!
【问题讨论】:
标签:
java
generics
unsafe
unchecked
【解决方案1】:
这意味着强制转换将检查返回的对象是否为某种Map,但由于类型擦除,它将无法检查有关其内容的任何内容。在执行时,地图就是地图……因此,如果有人将Map<Integer, String> 放入您的会话中,那行代码仍然会成功。当您尝试使用其中一个条目时,您只会收到错误消息,例如通过遍历条目并获取键和值。
欢迎来到 Java 泛型的古怪世界 :(
【解决方案3】:
JVM 不会像这样检查强制转换。
例如,(Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute"); 将等于 (Map) se.getSession().getServletContext().getAttribute("myattribute");