【发布时间】:2014-02-11 21:37:56
【问题描述】:
我正在转换旧的 java 代码以支持泛型,并遇到了这行代码,它试图将从会话中检索到的对象转换为 TreeMap:
TreeMap allTransactions = (TreeMap) pageContext.getSession()
.getAttribute("allTransactions");
当我尝试将其转换为特定类型时:
TreeMap<String, MyDataBean> allTransactions = (TreeMap<String, MyDataBean>)
pageContext.getSession().getAttribute("allTransactions");
它给了我一个warning:
Type safety: Unchecked cast from Object to TreeMap<String,MyDataBean>
为了彻底消除警告,我编写了一个方法将其转换为Map:
public static <K,V> Map<K,V> castToMap(Class<? extends K> clazz1,
Class<? extends V> clazz2, Map<?,?> c) {
Map<K,V> map = new TreeMap<K,V>();
for (Map.Entry<?,?> entry : c.entrySet()) {
Object key = entry.getKey();
Object value = entry.getValue();
map.put(clazz1.cast(key), clazz2.cast(value));
}
return map;
}
好消息:这次我修改初始代码调用这个方法时没有报错:
Map<String, MyDataBean> allTransactions = MyUtilityClass.castToMap(String.class,
MyDataBean.class,
(Map<?,?>)pageContext.getSession().getAttribute("allTransactions"));
但我仍然必须在 ^^^here 转换它来调用我的函数。
问题 1:
为什么现在我仍在使用演员表(Map<?,?>) 而不是我之前尝试过的(TreeMap<String,MyDataBean>) 时没有显示任何错误?
问题 2: 由于其他开发人员尚未提交代码,我的应用程序目前已损坏,因此我无法运行该应用程序并验证其正确性。任何人都可以通过查看它来判断此铸造的行为是否与以前相同?
【问题讨论】:
-
我认为添加该方法没有意义。它没有实现任何具体的目标。地图就是地图,通用符号只是装点门面——也许在编写新代码时可用作调试辅助工具,但当您知道代码按原样工作时,它只会妨碍您。
-
请注意,
TreeMap有一个接受地图的构造函数。所以你的演员可以简单地是return new TreeMap<K,V>(c);docs.oracle.com/javase/7/docs/api/java/util/… -
@HotLicks 我必须摆脱警告。你能推荐一个替代方案吗?
-
@corsiKa 当我这样写
return new TreeMap<K,V>((Comparator<? super K>) c);时,它仍然会发出未经检查的警告 -
原代码有什么问题?还是
TreeMap<?,?>?
标签: java session generics map casting