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

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

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.


慕容森
浏览 966回答 3
3回答

沧海一幻觉

当然,显而易见的答案是,不要不加限制地进行强制转换。如果这是绝对必要的,那么至少尝试限制@SuppressWarnings注释根据其爪哇,它可以对局部变量进行处理;这样,它甚至不会影响整个方法。例子:@SuppressWarnings("unchecked")Map<String,&nbsp;String>&nbsp;myMap&nbsp;=&nbsp;(Map<String,&nbsp;String>)&nbsp;deserializeMap();无法确定Map真的应该有泛型参数<String, String>..您必须事先知道参数应该是什么(否则当您得到ClassCastException)。这就是为什么代码会生成警告,因为编译器不可能知道是否安全。

慕婉清6462132

不幸的是,这里没有很好的选择。记住,所有这些都是为了维护类型安全。“Java泛型“提供了一种用于处理非泛化遗留库的解决方案,尤其在8.2节中有一种称为”空循环技术“的解决方案。基本上,进行不安全的转换,并抑制警告。然后像这样循环遍历地图:@SuppressWarnings("unchecked")Map<String,&nbsp;Number>&nbsp;map&nbsp;=&nbsp;getMap();for&nbsp;(String&nbsp;s&nbsp;:&nbsp;map.keySet());for&nbsp;(Number&nbsp;n&nbsp;:&nbsp;map.values());如果遇到意外类型,您将得到一个运行时ClassCastException,但至少会发生在问题源附近。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java