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(“未选中”)