10

Eclipse 显示了一个类型安全警告,我几乎尝试了一切来根除它(当然抑制它是一种选择),但不幸的是我没有成功。
你知道我必须如何更改我的代码,以便不再有类型安全警告。还是@SuppressWarnings("unchecked")唯一的办法?

ArrayList<String> arrayList= (ArrayList<String>) Classname.getArrayList();      
JSONArray obj = new JSONArray();
obj.addAll(arrayList); 

在最后一行显示以下类型安全警告:

类型安全:方法 addAll(Collection) 属于原始类型 ArrayList。应该对泛型类型 ArrayList 的引用进行参数化

JSONArray 来自org.json.simple.JSONArray. 你会推荐另一个包吗?

4

5 回答 5

3

org.json 和 org.json.simple JSON 解析器使用原始类型的集合。如果您正在寻找良好的泛型支持,请尝试Google GsonArrayList以下是使用 Gson序列化泛型的方法:

Gson gson = new Gson();

ArrayList<String> arrayList= (ArrayList<String>) ClassName.getArrayList();

// Serializing to a JSON element node
JsonElement jsonElement = gson.toJsonTree(arrayList);
System.out.println(jsonElement.isJsonArray()); // true

// Or, directly to JSON string
String json = gson.toJson(arrayList);
System.out.println(json);

以下是您如何反序列化相同的 JSON 字符串且其泛型完整:

Type type = new TypeToken<ArrayList<String>>(){}.getType();
ArrayList<String> arrayList = gson.fromJson(json, type);
于 2013-08-20T12:56:58.443 回答
3

如果你想使用 json 去这个库,这个库有很好的支持https://code.google.com/p/google-gson/

这是一个例子:

Gson gson = new Gson();
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5);

(Serialization)
String json = gson.toJson(ints); ==> json is [1,2,3,4,5]

谢谢

于 2013-08-20T12:45:40.023 回答
2

您的问题的简短答案是您必须压制它才能让它消失。问题不在于您使用 addAll 方法放置了什么,这是因为如果未提供类型,JSONArray 无法保证类型安全。

JSONArray 继承了一个非参数化的 ArrayList,addAll 方法定义为:

public boolean addAll(java.util.Collection<? extends E> es)

在不提供类型参数的情况下,E 回退到 Object,这使得 addAll 方法成为一种可以在现有集合之上添加包含 ANYTHING 的集合的方法。因此,您可以执行以下操作:

List<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Chiwawa());

List<Car> cars = new ArrayList<Car>();
cars.add(new BMW());

JSONArray jsonArray = new JSONArray();
jsonArray.addAll(dogs);
jsonArray.addAll(cars);

Dogs 和 Cars 一起添加到同一个 JSONArray (ArrayList) 中,并被视为几乎没有对象。如果你做这样的事情,当你取回任何物体时,你无法分辨它是狗还是汽车。这就是警告存在的原因。

通过使用泛型类型参数(例如 Dog),addAll 定义将类似于:

 public boolean addAll(java.util.Collection<? extends Dog> es)

这确保参数只能接受 Dog 和 Dog 的子类的集合。因此,当您从集合中检索它时,将检索对象分配给 Dog 是安全的。

警告不是因为你做错了什么。这是因为 JSONArray 继承了一个非参数化的集合。随意压制它。

于 2013-08-20T13:22:27.950 回答
0

从 的文档来看JSONArray,它看起来像是extends ArrayList原始类型(它没有泛型类型参数)。这是处理非通用遗留代码的一个例子,唯一的方法是非常确定JSONArray期望收到一些Strings 然后抑制警告。

(修复它的真正方法是更新JSONArray以使用泛型,但与此同时,您必须使用原始类型。)

于 2013-08-20T12:42:09.637 回答
0

使用Gson库转换ArrayListJsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
于 2016-06-14T17:55:48.450 回答