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

2022-09-04 20:08:55

我有一些数据存储在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")


答案 1

你的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 方法将不再生成警告


答案 2

如果您无法切换到另一个库或修改此库的代码以使其成为泛型,则唯一的其他选择是围绕此库编写一个包装器,该包使用它,并正确支持泛型。

因此,您将拥有自己的类,该类将包含 一个 、将扩展和实现 ,并将包含 所有方法的转发方法。JSONObjectorg.json.simple.JSONObjectHashMap<String, Object>Map<String, Object>org.json.simple.JSONObject

您仍然必须放入此类,但它将仅限于此类,并且您的所有其余代码都可以没有通用警告或禁止显示它们。@SuppressWarnings("unchecked")