类型安全:未经检查的演员

问题:

在我的spring应用程序上下文文件中,我有一些类似于

<util:map id="someMap" map-class="java.util.HashMap" key-type="java.lang.String" value-type="java.lang.String">
    <entry key="some_key" value="some value" />
    <entry key="some_key_2" value="some value" />   
</util:map>

在java类中,实现如下:

private Map<String, String> someMap = new HashMap<String, String>();
someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");

在Eclipse中,我看到一个警告:
 类型安全性:从Object到HashMap的未经检查的转换
我做错了什么?如何解决问题?

回答:

那么首先,你正在用新的HashMap创建调用浪费内存。您的第二行完全忽略了对此创建的hashmap的引用,从而使其可用于垃圾回收器。所以,不要这样做,使用:

private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");

其次,编译器抱怨您将对象转换为HashMap,而不检查它是否为HashMap。但是,即使你要做:

if(getApplicationContext().getBean("someMap") instanceof HashMap) {
    private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
}

你可能会收到这个警告。问题是getBean返回Object,所以不清楚是什么类型的。直接将其转换为HashMap不会导致第二种情况的问题(也可能在第一种情况下不会有警告,我不知道Java编译器对于Java 5的警告有多愚蠢)。但是,您将其转换为HashMap<String, String>
HashMaps是一个将对象作为关键字并将对象作为值HashMap<Object, Object>的地图。因此,没有任何保证,当你得到你的bean它可以被表示为HashMap<String, String>,因为你可以有HashMap<Date, Calendar>,因为返回的非泛型表示可以有任何对象。
如果代码编译,并且您可以执行String value = map.get("thisString");而没有任何错误,请不用担心此警告。但是,如果地图并不完全是字符串的字符串键值,那么在运行时你会得到一个ClassCastException,因为在这种情况下泛型不能阻止这种情况发生。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Type safety: Unchecked cast

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

发表评论

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

− 2 = 7