2010-05-28 141 views
8
Map session = ActionContext.getContext().getSession(); 
session.put("user", user); 

此代码生成警告:类型安全性:方法put(Object,Object)属于原始类型Map。参考通用类型地图< K,V>应参数化如何解决这个Java类型的安全警告?

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession(); 
session.put("user", user); 

此代码生成一个警告:类型安全:未选中从地图转换为地图<字符串,序列化>

getSession方法属于Struts2,所以我不能修改它。我想避免使用@SuppressWarnings,因为其他警告可能会有用。

我想世界上所有的Struts2用户都面临同样的问题......有没有一个优雅的解决方案?

回答

8

我不认为有任何其他的方式,但@SuppressWarnings(“未登记”)。我相信你可以把它放在问题的上方,它只会压制这条线。

编辑:你也可以做Map<?, ?> session = ActionContext.getContext().getSession();但我不确定你是多么愿意这么做;您将无法以任何方式将任何内容放入映射中(因为编译器无法检查您所放置的类型),因此只能从中读取。

0

如果你不喜欢这样写道:

Map<String, Serializable> session = ActionContext.getContext().getSession(); 
+0

它给了一个警告:类型安全:Map类型的表达式需要选中转换,以符合地图<字符串,可串行化> – 2010-05-28 08:14:21

1

您使用的是什么版本的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(); 
+0

不是吗?我收到一个警告(或者是一个错误?),如果我没有投... – helios 2010-05-28 08:17:23

+0

我使用2.1.8.1这是最新版本。您的建议会给出此警告:类型安全性:类型映射的表达式需要进行未经检查的转换以符合映射 2010-05-28 08:17:24

+1

http://struts.apache.org/2.1.8.1/struts2-core/apidocs/com/opensymphony /xwork2/ActionContext.html看起来2.1.8.1 getSession应该返回一个参数化映射。你确定它已正确安装并且没有使用先前安装的旧版本吗? – 2010-05-28 08:23:50

3

最安全,最有效的方式来处理这大概是:

Map<?, ?> session = ActionContext.getContext().getSession(); 

然后键入转换从会话映射中检索到的对象。

@SuppressWarnings方法实际上会导致相同的编译代码。然而,类型转换将是隐含的;即通过查看源代码将不容易发现。 @SuppressWarnings注释可以(假设)在代表真实错误的相同代码块中抑制一些其他警告;即会导致隐藏的类型转换之一等在运行时失败。

其他更便宜的替代品包括:

  • 通过进入副本的入口从Map<?, ?>到一个新的Map<String, Serializable>实例分别铸造的键值,以StringSerializable,或

  • 泛型方法就像以下那样安全地执行类型转换。


@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; 
} 
0

它要求你参数的值,如果这个值需要的参数,然后将它们传递。

例如

Map<Integer, Map> vCombinedCodeMap = new HashMap<>(); 

将给予 “参数” Map<Integer, Map>警告。

所以正确的格式如下:

Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>(); 
0

演员,如下图所示

public void setSession(Map<String, Object> sessionMap) { 

    // TODO Auto-generated method stub 

    this.sessionMap = (SessionMap<String, Object>) sessionMap; 
}