Java 如何强制转换要映射的会话对象?

Java 如何强制转换要映射的会话对象?,java,session,generics,map,casting,Java,Session,Generics,Map,Casting,我正在将旧的java代码转换为支持泛型,并遇到了这行代码,它试图将从会话检索到的对象强制转换为TreeMap: TreeMap allTransactions = (TreeMap) pageContext.getSession() .getAttribute("allTransactions"); public static <K,V> Map<K,V> castToMap(

我正在将旧的java代码转换为支持泛型,并遇到了这行代码,它试图将从会话检索到的对象强制转换为
TreeMap

TreeMap allTransactions = (TreeMap) pageContext.getSession()
                                               .getAttribute("allTransactions");
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;
}
当我尝试将其转换为特定类型时:

TreeMap<String, MyDataBean> allTransactions = (TreeMap<String, MyDataBean>) 
                       pageContext.getSession().getAttribute("allTransactions");
为了彻底消除警告,我编写了一个方法将其强制转换到
Map

TreeMap allTransactions = (TreeMap) pageContext.getSession()
                                               .getAttribute("allTransactions");
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;
}
公共静态映射CASTOMAP(c类){
Map Map=newtreemap();
对于(Map.Entry:c.entrySet()){
Object key=entry.getKey();
对象值=entry.getValue();
map.put(clazz1.cast(key),clazz2.cast(value));
}
返回图;
}
好消息:这一次我修改了初始代码以调用此方法,但没有收到任何错误:

Map<String, MyDataBean> allTransactions = MyUtilityClass.castToMap(String.class, 
                                                               MyDataBean.class, 
            (Map<?,?>)pageContext.getSession().getAttribute("allTransactions"));
Map allTransactions=MyUtilityClass.castToMap(String.class,
MyDataBean.class,
(映射)pageContext.getSession().getAttribute(“所有事务”);
但是我仍然必须在这里抛出它来调用我的函数

问题1: 为什么现在我仍在使用cast
(Map)
而与我以前尝试的
(TreeMap)
相比,它没有显示任何错误

问题2:
由于其他开发人员尚未提交代码,我的应用程序到目前为止已损坏,因此我无法运行该应用程序并验证其正确性。任何人都可以通过看它来判断,这个角色的行为是否与以前一样?

如果它是一个
映射
,那么它就隐式地是一个
映射
——就像任何事物的映射一样。它认为这是一个安全的施法,因为它是一个地图,它不能失败。在这一点上,这和将其投射到任何其他对象没有什么不同,他们认为这是安全的

如果它是一个糟糕的演员阵容(比如说它是一个列表,而不是一张地图),那么它将在其他任何事情出错之前在那里爆炸。但由于这些类型在编译时丢失,如果问题出在泛型类型中,它将很高兴地继续。所以
Map
被认为是安全的,因为如果这是问题的话,它会因为不是Map而爆炸


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

如果它是一个
映射
,那么它就隐式地是一个
映射
——就像任何东西的映射一样。它认为这是一个安全的施法,因为它是一个地图,它不能失败。在这一点上,这和将其投射到任何其他对象没有什么不同,他们认为这是安全的

如果它是一个糟糕的演员阵容(比如说它是一个列表,而不是一张地图),那么它将在其他任何事情出错之前在那里爆炸。但由于这些类型在编译时丢失,如果问题出在泛型类型中,它将很高兴地继续。所以
Map
被认为是安全的,因为如果这是问题的话,它会因为不是Map而爆炸


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

如果它是一个
映射
,那么它就隐式地是一个
映射
——就像任何东西的映射一样。它认为这是一个安全的施法,因为它是一个地图,它不能失败。在这一点上,这和将其投射到任何其他对象没有什么不同,他们认为这是安全的

如果它是一个糟糕的演员阵容(比如说它是一个列表,而不是一张地图),那么它将在其他任何事情出错之前在那里爆炸。但由于这些类型在编译时丢失,如果问题出在泛型类型中,它将很高兴地继续。所以
Map
被认为是安全的,因为如果这是问题的话,它会因为不是Map而爆炸


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

如果它是一个
映射
,那么它就隐式地是一个
映射
——就像任何东西的映射一样。它认为这是一个安全的施法,因为它是一个地图,它不能失败。在这一点上,这和将其投射到任何其他对象没有什么不同,他们认为这是安全的

如果它是一个糟糕的演员阵容(比如说它是一个列表,而不是一张地图),那么它将在其他任何事情出错之前在那里爆炸。但由于这些类型在编译时丢失,如果问题出在泛型类型中,它将很高兴地继续。所以
Map
被认为是安全的,因为如果这是问题的话,它会因为不是Map而爆炸


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

Ad 1:强制转换本身是安全的,因为您没有指定编译器无法与方法签名匹配的任何类型。Java 4
List
可以安全地分配给Java 5
List
,但是当您指定一个类型时,您假定了一些东西,编译无法安全地检查(因此警告)


Ad 2.:您用“软”方法调用强制转换替换了“硬”语言强制转换,如果类之间不能强制转换,则同样会失败-我更喜欢不太详细的语言强制转换版本,因为人们应该依赖自己的API。

Ad 1.:强制转换本身是安全的,因为您没有指定任何