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

toe95027  于 2022-11-20  发布在  Java
关注(0)|答案(8)|浏览(305)
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用户都面临着同样的问题...有没有一个优雅的解决方案?

5tmbdcev

5tmbdcev1#

@SuppressWarnings("unchecked")
public class CustomHashMap<K, V> {

  private class Entry {
    private K key;
    private V value;

    public Entry(K key, V value) {
      this.key = key;
      this.value = value;
    }

  }

  private LinkedList<Entry>[] entries = new LinkedList[5]; // this line shows warning to check types
}
bkhjykvo

bkhjykvo2#

我认为除了@SuppressWarnings(“unchecked”)之外没有其他方法了。我相信你可以把它放在有问题的那行上面,它只会抑制那行。
编辑:你也可以做Map<?, ?> session = ActionContext.getContext().getSession();,但我不确定你有多愿意这么做;您不能以这种方式将任何内容放入Map中(因为编译器不能检查所放入内容的类型),只能从中读取。

kcugc4gi

kcugc4gi3#

最安全、最有效的处理方法可能是:

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

然后对从会话Map中检索到的对象进行类型转换。
@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;
}
z9ju0rcb

z9ju0rcb4#

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

yyhrrdl85#

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

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

将对“参数化”Map<Integer, Map>给予警告。
因此正确的格式如下:

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

h7appiyu6#

如果您这样做会怎样:

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

ttygqcqt7#

浇筑如下:

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

    // TODO Auto-generated method stub

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

bfrts1fy8#

只要在@GET方法的顶部写上@SuppressWarnings("unchecked"),希望它能对你有所帮助。

相关问题