如何解决这个Java类型的安全警告?

时间:2010-05-28 07:42:47

标签: java generics casting struts2

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);

此代码生成警告:类型安全:未选中从地图转换为地图&lt; String,Serializable&gt;

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

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

7 个答案:

答案 0 :(得分:10)

我认为除了@SuppressWarnings(“未选中”)之外还有其他任何方式。我相信你可以把它放在有问题的线上方,它只能压制那条线。

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

答案 1 :(得分:4)

最安全,最有效的方法可能是:

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

答案 2 :(得分: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();

答案 3 :(得分:1)

它要求您参数化该值,如果值需要参数,则传递它们。

例如

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

将警告&#34;参数化&#34; Map<Integer, Map>

所以正确的格式如下:

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

答案 4 :(得分:0)

如果你这样做会怎么样:

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

答案 5 :(得分:0)

演员如下,

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

    // TODO Auto-generated method stub

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

答案 6 :(得分:0)

只需在@SuppressWarnings("unchecked")方法顶部编写@GET,希望对您有所帮助。