首页 文章

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

提问于
浏览
10

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

6 回答

  • 0

    你的JSONObject是什么,它是从HashMap继承的吗?如果是,warn可能意味着你应该声明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方法将不再生成警告

  • 14

    如果你不能切换到另一个库或修改这个库的代码使其成为通用的,那么唯一的另一个选择就是在这个使用它的库周围编写一个包装器,并正确支持泛型 .

    因此,您将拥有自己的 JSONObject 类,其中包含 org.json.simple.JSONObject ,将扩展 HashMap<String, Object> 并实现 Map<String, Object> ,并将包含 org.json.simple.JSONObject 的所有方法的转发方法 .

    你仍然需要在这个类中放入 @SuppressWarnings("unchecked") ,但它只限于这个类,你的所有其余代码都可以没有通用警告或抑制它们 .

  • 0

    您可以创建一个 Map 对象,然后对JSONObject进行显式转换

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

    但请注意,这将限制您只在JSON中包含“字符串” . 如果你放入另一个数据结构,你会看到编译错误 . 说一个数组 .

  • 0

    仅供参考 org.codehaus.jettison.json.JSONObject 不会引起此警告 . 使用codehaus'JSONObject时,您还可以通过 org.codehaus.jettison.json.JSONException 捕获解析错误 . 有关详细信息,请参阅https://github.com/codehaus/jettison .

  • 0

    另一种选择是使用(参数化) Map<String, Object> 初始化 JSONObject . 这样,值可以是任何有效的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;
        }
        ...
    }
    
  • 2

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

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

相关问题