为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理未检查的强制转换警告?

如何处理未检查的强制转换警告?

慕容森 2019-06-24 10:37:30
如何处理未检查的强制转换警告?Eclipse向我发出以下形式的警告:类型安全性:未选中的从对象到HashMap的强制转换这是对API的调用,我无法控制哪个API返回对象:HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {   HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");   return theHash;}如果可能的话,我希望避免Eclipse警告,因为理论上它们至少表明了一个潜在的代码问题。不过,我还没有找到一个很好的方法来消除这个问题。我可以将涉及到的单行单独提取到一个方法中,然后添加@SuppressWarnings("unchecked")对于该方法,从而限制了在我忽略警告的情况下拥有一个代码块的影响。有更好的选择吗?我不想在Eclipse中关闭这些警告。在我开始编写代码之前,它比较简单,但仍然引发了警告:HashMap getItems(javax.servlet.http.HttpSession session) {   HashMap theHash = (HashMap)session.getAttribute("attributeKey");   return theHash;}当您尝试使用会收到警告的散列时,其他地方出现了问题:HashMap items = getItems(session);items.put("this", "that");Type safety: The method put(Object, Object) belongs to the raw type HashMap.   References to generic type HashMap<K,V> should be parameterized.
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

当然,显而易见的答案是,不要不加限制地进行强制转换。

如果这是绝对必要的,那么至少尝试限制@SuppressWarnings注释根据其爪哇,它可以对局部变量进行处理;这样,它甚至不会影响整个方法。

例子:

@SuppressWarnings("unchecked")Map<String, String> myMap = (Map<String, String>) deserializeMap();

无法确定Map真的应该有泛型参数<String, String>..您必须事先知道参数应该是什么(否则当您得到ClassCastException)。这就是为什么代码会生成警告,因为编译器不可能知道是否安全。


查看完整回答
反对 回复 2019-06-24
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

不幸的是,这里没有很好的选择。记住,所有这些都是为了维护类型安全。“Java泛型“提供了一种用于处理非泛化遗留库的解决方案,尤其在8.2节中有一种称为”空循环技术“的解决方案。基本上,进行不安全的转换,并抑制警告。然后像这样循环遍历地图:

@SuppressWarnings("unchecked")Map<String, Number> map = getMap();for (String s : map.keySet());for (Number n : map.values());

如果遇到意外类型,您将得到一个运行时ClassCastException,但至少会发生在问题源附近。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 965 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信