Java如何解决未经检查的演员表警告?

Eclipse给我以下形式的警告:

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

这是从对我无法控制返回对象的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.

回答:

问题是没有检查演员表。因此,你必须自己检查。你不能只使用instanceof检查参数化类型,因为参数化类型信息在运行时不可用,在编译时已被擦除。

但是,你可以使用instanceof对散列中的每个项目执行检查,并以此来构造类型安全的新散列。而且你不会招来任何警告。

感谢mmyers和Esko Luontola,我已经将我最初在此处编写的代码参数化了,因此可以将其包装在某个实用程序类中的某个地方,并用于任何参数化的HashMap。如果你想更好地理解它并且对泛型不是很熟悉,建议你查看此答案的编辑历史记录。

public static <K, V> HashMap<K, V> castHash(HashMap input,

Class<K> keyClass,

Class<V> valueClass) {

HashMap<K, V> output = new HashMap<K, V>();

if (input == null)

return output;

for (Object key: input.keySet().toArray()) {

if ((key == null) || (keyClass.isAssignableFrom(key.getClass()))) {

Object value = input.get(key);

if ((value == null) || (valueClass.isAssignableFrom(value.getClass()))) {

K k = keyClass.cast(key);

V v = valueClass.cast(value);

output.put(k, v);

} else {

throw new AssertionError(

"Cannot cast to HashMap<"+ keyClass.getSimpleName()

+", "+ valueClass.getSimpleName() +">"

+", value "+ value +" is not a "+ valueClass.getSimpleName()

);

}

} else {

throw new AssertionError(

"Cannot cast to HashMap<"+ keyClass.getSimpleName()

+", "+ valueClass.getSimpleName() +">"

+", key "+ key +" is not a " + keyClass.getSimpleName()

);

}

}

return output;

}

这项工作量很大,可能只获得很少的报酬…我不确定是否会使用它。对于人们认为是否值得的任何评论,我将不胜感激。另外,我也很高兴提出改进建议:除了抛出AssertionErrors之外,我还能做点更好的事情吗?有什么我可以扔的更好的东西吗?我应该将其设为检查异常吗?

以上是 Java如何解决未经检查的演员表警告? 的全部内容, 来源链接: utcz.com/qa/409746.html

回到顶部