在我的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创建调用浪费内存。你的第二行完全忽略了对此创建的哈希图的引用,从而使该哈希图可用于垃圾收集器。因此,不要这样做,请使用:
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"); }
你可能仍然会收到此警告。问题是getBeanreturn Object,所以类型是未知的。将其HashMap直接转换为第二种情况不会引起问题(并且在第一种情况下可能不会发出警告,我不确定Java编译器对Java 5发出警告有多学问)。但是,你正在将其转换为HashMap<String, String>。
getBeanreturn Object
HashMap
HashMap<String, String>
HashMaps实际上是将对象作为键并将对象作为值的地图(HashMap<Object, Object>如果愿意)。因此,不能保证在获取bean时可以将其表示为a,HashMap<String, String>因为HashMap<Date, Calendar>返回的非泛型表示可以具有任何对象,因此可以将其表示为。
HashMap<Object, Object>
HashMap<Date, Calendar>
如果代码可以编译,并且你可以执行String value = map.get("thisString");而没有任何错误,则不必担心此警告。但是,如果映射不是完全由字符串键组成的,则ClassCastException在运行时会得到一个,因为泛型无法阻止这种情况的发生。
String value = map.get("thisString")
问题是强制转换是运行时检查-但由于类型擦除,在运行时a HashMap<String,String>和HashMap<Foo,Bar>其他任何Fooand 之间实际上没有区别Bar。
a HashMap<String,String>
HashMap<Foo,Bar>
使用@SuppressWarnings("unchecked")并保持鼻子。哦,在Java中推广泛型化的运动:)
@SuppressWarnings("unchecked")