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

新手上路,请多包涵
Map session = ActionContext.getContext().getSession();
session.put("user", user);

此代码生成警告: _类型安全:方法 put(Object, Object) 属于原始类型 Map。对泛型类型 Map 的引用应该被参数化_。

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

此代码生成警告: 类型安全:未检查从 Map 到 Map 的转换。

getSession 方法是Struts2的,不能修改。我想避免使用 @SuppressWarnings 因为其他警告可能有用。

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

原文由 Nicolas Raoul 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 640
2 个回答

除了@SuppressWarnings(“unchecked”),我认为没有其他办法。我相信你可以把它放在有问题的线的正上方,它只会抑制那条线。

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

原文由 Andrei Fierbinteanu 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

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

然后对从会话映射中检索到的对象进行类型转换。

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

其他更昂贵的替代品包括:

  • an entry by entry copy from the Map<?, ?> to a new Map<String, Serializable> instance casting the keys and values to String and Serializable respectively, or

  • 像下面这样的通用方法可以安全地执行类型转换。


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

原文由 Stephen C 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题