Map session = ActionContext.getContext().getSession();
session.put("user", user);
此代码将生成警告:Type safety: The method put(Object, Object) belongs to the raw type Map. References to generic type Map<K,V> should be parameterized
.
Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);
此代码将生成警告:Type safety: Unchecked cast from Map to Map<String,Serializable>
.
getSession方法属于Struts2,所以我无法修改它。我希望避免使用@SuppressWarnings,因为其他警告可能会很有用。
我想世界上所有的Struts2用户都面临着同样的问题...有没有一个优雅的解决方案?
8条答案
按热度按时间5tmbdcev1#
bkhjykvo2#
我认为除了@SuppressWarnings(“unchecked”)之外没有其他方法了。我相信你可以把它放在有问题的那行上面,它只会抑制那行。
编辑:你也可以做
Map<?, ?> session = ActionContext.getContext().getSession();
,但我不确定你有多愿意这么做;您不能以这种方式将任何内容放入Map中(因为编译器不能检查所放入内容的类型),只能从中读取。kcugc4gi3#
最安全、最有效的处理方法可能是:
然后对从会话Map中检索到的对象进行类型转换。
@SuppressWarnings方法实际上会产生相同的编译代码。但是类型转换是隐式的;也就是说,通过查看源代码很难发现它。而且,@SuppressWarnings注解可以(假设地)在同一代码块中隐藏一些代表真实的错误的 * 其他 * 警告;即将导致隐藏类型转换等之一在运行时失败的一个。
其他更昂贵的替代品包括:
Map<?, ?>
到新Map<String, Serializable>
示例的逐个条目复制,将键和值分别转换为String
和Serializable
,或者z9ju0rcb4#
您使用的是什么版本的Struts 2(尤其是
XWork
)?对我来说,您的以下代码会产生错误:另一方面,此方法有效且不发出警告:
yyhrrdl85#
它要求您参数化值,如果值需要参数,则传递参数。
比如说
将对“参数化”
Map<Integer, Map>
给予警告。因此正确的格式如下:
h7appiyu6#
如果您这样做会怎样:
ttygqcqt7#
浇筑如下:
bfrts1fy8#
只要在
@GET
方法的顶部写上@SuppressWarnings("unchecked")
,希望它能对你有所帮助。