gpt4 book ai didi

java - 如何将 Session 对象转换为 Map?

转载 作者:行者123 更新时间:2023-12-01 23:12:17 24 4
gpt4 key购买 nike

我正在转换旧的java代码以支持泛型,并遇到了这行代码,它试图将从 session 中检索到的对象转换为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:由于其他开发人员尚未提交代码,我的应用程序现已损坏,因此我无法运行该应用程序并验证其正确性。任何人都可以通过观察来判断这个 Actor 是否会像以前一样表现?

最佳答案

如果是Map那么它隐式是 Map<?,?> - 就像任何东西的 map 一样。它认为这是一个安全的转换,因为它是一张 map ,所以它不会失败。此时,这与将其转换为任何其他对象没有什么不同,他们认为这是安全的。

如果它是一个糟糕的类型转换(假设它是一个列表,而不是 map )那么它会在其他任何问题出现之前在那里爆炸。但因为这些类型在编译时丢失,所以如果问题出在泛型类型上,它会很高兴地继续。所以Map<?,?>被认为是安全的,因为如果这是问题所在,它会因为不是 map 而爆炸。

就你的第二个问题而言,它看起来不错,但如果没有更多上下文,就很难说。话虽这么说,您应该能够使用源代码管理中的历史记录来获取早期版本进行比较。如果您无法获得代码的早期版本,那么您的源代码管理就不是很有用,现在不是吗?

关于java - 如何将 Session 对象转换为 Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com