在我的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<String,String>
出了什么问题?
下面的代码导致类型安全警告
myInput = (Map<String, Object>) myRequest.get();
解决方案
创建一个新的Map Object而不提及参数,因为列表中持有的对象类型没有得到验证。
步骤1:创建一个新的临时Map
地图< ?, ?> tempMap = (Map<??>) myRequest.get();
步骤2:实例化主Map
Map<String, Object> myInput=new HashMap<>(myInputObj.size());
步骤3:迭代临时Map并将值设置到主Map中
for(Map.Entry<?, ?> entry :myInputObj.entrySet()){
myInput.put((String)entry.getKey(),entry.getValue());
}
首先,使用新的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>。
HashMap是一种以对象为键并以对象为值的映射,HashMap< object object >。因此,当您获得bean时,不能保证它可以表示为HashMap<String, String>,因为您可以使用HashMap<Date, Calendar>,因为返回的非泛型表示可以有任何对象。
如果代码被编译,你可以执行String value = map.get("thisString");如果没有任何错误,不要担心这个警告。但是,如果映射不完全是字符串键到字符串值,则将在运行时得到ClassCastException,因为泛型在这种情况下无法阻止这种情况的发生。