本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
问题:Type safety: Unchecked cast
在我的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中,我看到一条警告:
Type safety: Unchecked cast from Object to HashMap
我在哪里出错了?我该如何解决该问题?
回答
好吧,首先,你正在通过新建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,因为泛型无法阻止这种情况的发生。
文章翻译自Stack Overflow:stackoverflow.com/questions/2…