【问题标题】: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&lt;Integer, String&gt; 放入您的会话中,那行代码仍然会成功。当您尝试使用其中一个条目时,您只会收到错误消息,例如通过遍历条目并获取键和值。

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

【讨论】:

    【解决方案2】:

    这是一个未经检查的演员表。作为程序员的您可能知道 se.getSession() 应该是那个确切的类型,带有&lt;String, ProxySession&gt; 参数,所以你正在做演员,但它可能不是那个确切的类型(编译器建议)。由于您没有以编程方式检查它,因此编译器会警告您。

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

    【讨论】:

      【解决方案3】:

      JVM 不会像这样检查强制转换。 例如,(Map&lt;String, ProxySession&gt;) se.getSession().getServletContext().getAttribute("myattribute"); 将等于 (Map) se.getSession().getServletContext().getAttribute("myattribute");

      【讨论】:

        猜你喜欢
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-20
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多