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

发布于 2024-12-10 15:54:33 字数 282 浏览 0 评论 0原文

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

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

强制转换是否错误?我不明白我在这里缺少什么。

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

谢谢!

I am wondering why the following issues a warning about an unsafe / unchecked operation:

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

Is the cast wrong? I can't understand what I am missing here.

P.S. I don't want to get rid of the warning, I want to understand the unsafe operation.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

帅的被狗咬 2024-12-17 15:54:33

这意味着强制转换将检查返回的对象是否是某种Map,但由于类型擦除,它无法检查其内容的任何内容。在执行时,映射是映射是映射...因此,如果有人将 Map 放入您的会话中,该行代码仍然会成功。仅当您尝试使用其中一个条目时才会出现错误,例如通过迭代条目并获取键和值。

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

It means that the cast will check that the returned object is a Map of some kind, but it won't be able to check anything about its contents, due to type erasure. At execution time, a map is a map is a map... so if someone put a Map<Integer, String> into your session instead, that line of code would still succeed. You'd only get an error when you tried to use one of the entries, e.g. by iterating over the entries and fetching the key and value.

Welcome to the wacky world of Java generics :(

山田美奈子 2024-12-17 15:54:33

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

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

It's an unchecked cast. You as a programmer may know that se.getSession() is expected to be of that exact type, with <String, ProxySession> parameters, so you're doing the cast, but it may not be of that exact type (the compiler suggests). Since you aren't programatically checking that, the compiler warns you.

See also: How do I address unchecked cast warnings?

慕巷 2024-12-17 15:54:33

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

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");

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文