我想知道为什么以下会发出有关不安全/未经检查的操作的警告:
Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");
演员阵容错了吗?我无法理解我在这里缺少什么。
PS我不想摆脱警告,我想了解不安全的操作。
谢谢!
这意味着强制转换将检查返回的对象是否属于某种类型,但由于类型擦除Map
,它将无法检查有关其内容的任何内容。在执行时,地图就是地图……因此,如果有人将 a放入您的会话中,那行代码仍然会成功。当您尝试使用其中一个条目时,您只会得到一个错误,例如通过迭代条目并获取键和值。Map<Integer, String>
欢迎来到 Java 泛型的古怪世界 :(
这是一个未经检查的演员表。作为程序员,您可能知道 se.getSession() 应该是带有<String, ProxySession>
参数的确切类型,因此您正在进行强制转换,但它可能不是那种确切类型(编译器建议)。由于您没有以编程方式检查它,因此编译器会警告您。
另请参阅:如何解决未经检查的强制转换警告?
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");