Java中的JSON和泛型-类型安全警告

Translate

我有一些存储在Java元素中的数据,我需要以给定的格式JSONObject返回它。虽然我的实现工作正常,但仍然从eclipse收到警告消息(版本:Juno Service Release 2):

"类型安全:put(Object,Object)方法属于原始类型HashMap。泛型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")?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

您的JSONObject是什么,它是从HashMap继承的吗?如果是,则警告可能意味着您应该声明JSONObject实例,如下所示:

JSONObject<String,Object> obj=new JSONObject<String,Object>();

更新:查看JSONObject的定义:

public class JSONObject extends HashMap

它扩展了HashMap,但不支持参数类型(如果其定义为

public class JSONObject<K,V> extends HashMap<K,V>

然后我们可以写

JSONObject<String,Object> obj=new JSONObject<String,Object>();

并且put方法将不再生成警告

来源
Translate

如果您不能切换到另一个库或修改该库的代码以使其通用,则唯一的选择是在使用该库的库周围编写包装,并正确支持通用。

所以你会有自己的JSONObject包含一个org.json.simple.JSONObject,将扩展HashMap<String, Object>并实施Map<String, Object>,并且将包含所有方法的转发方法org.json.simple.JSONObject.

您仍然需要放@SuppressWarnings("unchecked")在此类中,但仅限于此类,您的所有其他代码可能都没有通用警告或对它们的抑制。

来源
Translate

公共类JSONObject扩展了HashMap实现Map,JSONAware,JSONStreamAware

但是在类定义中没有类型参数,您唯一的选择是添加@SuppressWarnings(“ unchecked”)

来源
Translate

您可以创建一个地图对象,然后将其显式转换为JSONObject

Map<String, String> obj =  new HashMap<String, String>();
obj.put("id",way.getId());
JSONObject jsonObj =  (JSONObject) obj;

但是请注意,这将限制您仅在JSON中包含“字符串”。如果放置其他数据结构,则会看到编译错误。说一个数组。

来源
Translate

费耶org.codehaus.jettison.json.JSONObject不会导致此警告。当使用codehaus的JSONObject时,您还可以通过以下方式捕获解析错误org.codehaus.jettison.json.JSONException。看到https://github.com/codehaus/jettison有关详细信息。

来源
Translate

另一种选择是初始化JSONObject与(参数化)Map<String, Object>。这样,值可以是任何有效的JSON类型,并且避免使用unchecked警告。例如:

public class WayToJsonConverter{
    ...
    public JSONObject wayToJson(){
        Map<String, Object> 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;
    }
    ...
}
来源
Leave a Reply
You must be logged in to post a answer.
关于作者