【发布时间】:2010-10-05 06:38:15
【问题描述】:
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.
【问题讨论】:
-
如果您正在使用这样的 HttpSession,请查看 Brian Goetz 关于该主题的文章:ibm.com/developerworks/library/j-jtp09238.html
-
如果一个未经检查的演员表是不可避免的,一个好主意是将它与逻辑上表示它的类型的东西(如
enum甚至Class<T>的实例)紧密结合,这样你就可以看一眼它并且知道它是安全的。 -
我会添加,我发现我只能在包含违规代码的方法级别添加 @SuppressWarnings("unchecked") 。因此,我将代码分解为必须执行此操作的例程。我一直认为您可以在相关行的上方立即执行此操作。