Map session = ActionContext.getContext().getSession();
session.put("user", user);
此代码生成警告:类型安全:方法put(Object,Object)属于原始类型Map。应参数化对泛型类型Map <K,V>的引用。
Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);
此代码生成警告:类型安全:未选中从Map转换为Map <String,Serializable>。
getSession方法属于Struts2,所以我不能修改它。我想避免使用@SuppressWarnings,因为其他警告可能很有用。
我想世界上所有Struts2用户都遇到了同样的问题......有一个优雅的解决方案吗?
我认为除了@SuppressWarnings(“未选中”)之外还有其他任何方式。我相信你可以把它放在有问题的线上方,它只能压制那条线。
编辑:你也可以做Map<?, ?> session = ActionContext.getContext().getSession();
,但我不确定你是多么愿意这样做;你将无法将任何东西放入地图中(因为编译器无法检查你所放置的类型),只能从中读取。
处理这个问题最安全,最有效的方法可能是:
Map<?, ?> session = ActionContext.getContext().getSession();
然后键入强制转换从会话映射中检索的对象。
@SuppressWarnings方法实际上会导致编译的代码完全相同。但是类型转换将是隐含的;即通过查看源代码来发现它并不容易。并且@SuppressWarnings注释可以(假设地)在同一代码块中抑制一些代表真实错误的其他警告;即一个会导致其中一个隐藏的类型转换,等等在运行时失败。
其他更昂贵的替代品包括:
Map<?, ?>
的条目副本到新的Map<String, Serializable>
实例的条目,分别将密钥和值投射到String
和Serializable
,或者@SuppressWarnings("unchecked")
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) {
for (Map.Entry<?, ?> entry : map.entrySet()) {
kClass.cast(entry.getKey());
vClass.cast(entry.getValue());
}
return (Map<K,V>) map;
}
您使用的是什么版本的Struts 2(尤其是XWork
)?对我来说,您的以下代码给出了错误:
Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);
Cannot cast from Map<String,Object> to Map<String,Serializable>.
另一方面,这可以起作用并且不会发出警告:
Map<String, Object> session = ActionContext.getContext().getSession();
它要求您参数化值,如果值需要参数然后传递它们。
例如
Map<Integer, Map> vCombinedCodeMap = new HashMap<>();
将对“参数化”Map<Integer, Map>
发出警告。
所以正确的格式如下:
Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>();
如果你这样做会怎么样:
Map<String, Serializable> session = ActionContext.getContext().getSession();
演员如下,
public void setSession(Map<String, Object> sessionMap) {
// TODO Auto-generated method stub
this.sessionMap = (SessionMap<String, Object>) sessionMap;
}
只需在@SuppressWarnings("unchecked")
方法的顶部写@GET
,希望它能帮到你。