如何处理未经检查的投射警告?

问题:

Eclipse给我一个警告如下表格:

类型安全性:从Object到HashMap的未经检查的转换

这是从一个API调用,我无法控制哪个返回Object:

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.

回答:

当然,明显的答案是不要做这个未经验证的演员。
如果绝对有必要,那么至少尝试限制@SuppressWarnings注释的范围。根据其Javadocs,它可以依赖于局部变量;这样,它甚至不影响整个方法。
例:

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

没有办法确定Map是否应该具有通用参数<String, String>。你必须事先知道什么参数(或者你会发现,当你得到一个ClassCastException)。这就是为什么代码生成一个警告,因为编译器不可能知道是否安全。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How do I address unchecked cast warnings?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 22 = 29