Java中的JSON和generics – 类型安全警告
我有一些数据存储在Java元素中,我需要以给定的格式返回它 – JSONObject。 虽然我的实现工作正常,但我仍然收到来自eclipse的警告消息(版本:Juno Service Release 2):
“ 类型安全:方法put(Object,Object)属于原始类型HashMap。对generics类型HashMap的引用应该参数化 ”
这是我的代码:
public interface Element {...} public abstract class AbstractElement implements Element {...} public final class Way extends AbstractElement {...} import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.json.simple.JSONArray; import org.json.simple.JSONObject; public class WayToJsonConverter{ ... public JSONObject wayToJson(){ JSONObject obj = new JSONObject(); obj.put("id",way.getId()); ... return obj; } ... }
有问题的一行是: obj.put("id",way.getId());
有没有办法解决这个问题,然后添加@SuppressWarnings("unchecked")
?
你的JSONObject是什么,它是从HashMapinheritance的吗? 如果是,警告可能意味着您应该声明JSONObject实例,如下所示:
JSONObject obj=new JSONObject();
更新:查看JSONObject的定义:
public class JSONObject extends HashMap
它扩展了HashMap但不支持参数类型,如果它的定义是
public class JSONObject extends HashMap
然后我们可以写
JSONObject obj=new JSONObject();
并且put方法将不再生成警告
如果你不能切换到另一个库或修改这个库的代码使其成为通用的,那么唯一的另一个选择就是在这个使用它的库周围编写一个包装器,并正确支持generics。
因此,您将拥有自己的JSONObject
类,它将包含org.json.simple.JSONObject
,将扩展HashMap
并实现Map
,并将包含org.json.simple.JSONObject
所有方法的转发方法org.json.simple.JSONObject
。
您仍然需要在@SuppressWarnings("unchecked")
中放置@SuppressWarnings("unchecked")
,但它将仅限于此类,并且您的所有其余代码可以没有通用警告或抑制它们。
您可以创建一个地图对象,然后对JSONObject进行显式转换
Map obj = new HashMap(); obj.put("id",way.getId()); JSONObject jsonObj = (JSONObject) obj;
但请注意,这将限制您只在JSON中包含“字符串”。 如果你放入另一个数据结构,你会看到编译错误。 说一个数组。
FYI org.codehaus.jettison.json.JSONObject
不会导致此警告。 使用codehaus’JSONObject时,您还可以通过org.codehaus.jettison.json.JSONException
捕获解析错误。 有关详细信息,请参阅https://github.com/codehaus/jettison 。
另一个选项是使用(参数化的) Map
初始化JSONObject
。 这样,值可以是任何有效的JSON类型,并且您可以避免unchecked
警告。 例如:
public class WayToJsonConverter{ ... public JSONObject wayToJson(){ Map forJsonObj = new HashMap<>(); forJsonObj.put("id",way.getId()); // No warning, hurray! forJsonObj.put("integer", 14); forJsonObj.put("floating", 1.4); JSONObject obj = new JSONObject(forJsonObj); ... return obj; } ... }
公共类JSONObject扩展HashMap实现Map,JSONAware,JSONStreamAware
但是在类定义中没有类型参数,你唯一的选择是添加@SuppressWarnings(“未选中”)