首页 文章

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

提问于
浏览
11
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用户都遇到了同样的问题......有一个优雅的解决方案吗?

6 回答

  • 1

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

    编辑:你也可以做 Map<?, ?> session = ActionContext.getContext().getSession(); 但是我能够将任何东西放到 Map 上(因为编译器可以重新放置),只能读取它 .

  • 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

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

    它要求您参数化值,如果值需要参数然后传递它们 .

    例如

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

    会给"parameterized" Map<Integer, Map> 发出警告 .

    所以正确的格式如下:

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

    如果你这样做会怎么样:

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

    演员如下,

    public void setSession(Map<String, Object> sessionMap) {
    
        // TODO Auto-generated method stub
    
        this.sessionMap = (SessionMap<String, Object>) sessionMap;
    }
    

相关问题