我有一些数据存储在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 回答
你的JSONObject是什么,它是从HashMap继承的吗?如果是,warn可能意味着你应该声明JSONObject实例,如下所示:
更新:查看JSONObject的定义:
它扩展了HashMap但不支持参数类型,如果它的定义是
然后我们可以写
并且put方法将不再生成警告
如果你不能切换到另一个库或修改这个库的代码使其成为通用的,那么唯一的另一个选择就是在这个使用它的库周围编写一个包装器,并正确支持泛型 .
因此,您将拥有自己的
JSONObject
类,其中包含org.json.simple.JSONObject
,将扩展HashMap<String, Object>
并实现Map<String, Object>
,并将包含org.json.simple.JSONObject
的所有方法的转发方法 .你仍然需要在这个类中放入
@SuppressWarnings("unchecked")
,但它只限于这个类,你的所有其余代码都可以没有通用警告或抑制它们 .您可以创建一个 Map 对象,然后对JSONObject进行显式转换
但请注意,这将限制您只在JSON中包含“字符串” . 如果你放入另一个数据结构,你会看到编译错误 . 说一个数组 .
仅供参考
org.codehaus.jettison.json.JSONObject
不会引起此警告 . 使用codehaus'JSONObject时,您还可以通过org.codehaus.jettison.json.JSONException
捕获解析错误 . 有关详细信息,请参阅https://github.com/codehaus/jettison .另一种选择是使用(参数化)
Map<String, Object>
初始化JSONObject
. 这样,值可以是任何有效的JSON类型,并且您可以避免unchecked
警告 . 例如 . :公共类JSONObject扩展HashMap实现Map,JSONAware,JSONStreamAware
但是在类定义中没有类型参数,你唯一的选择就是添加@SuppressWarnings(“未选中”)