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
。你会推荐另一个套餐吗?
答案 0 :(得分:3)
如果您想使用json go这个库,这个库有一个很好的支持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]
由于
答案 1 :(得分:3)
org.json和org.json.simple JSON解析器使用下面的原始类型的集合。如果您正在寻找良好的 Generics 支持,请尝试Google Gson。以下是使用Gson序列化通用ArrayList
的方法:
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);
以下是如何使用 Generics 完整地反序列化相同的JSON字符串:
Type type = new TypeToken<ArrayList<String>>(){}.getType();
ArrayList<String> arrayList = gson.fromJson(json, type);
答案 2 :(得分:1)
你的问题的简短答案是你必须压制它以使它消失。问题不在于您使用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)并被视为几乎没有Object。如果你做这样的事情,当你找回任何一个物体时,你无法分辨它是狗还是汽车。这就是警告存在的原因。
通过使用泛型类型参数(例如Dog),addAll定义将类似于:
public boolean addAll(java.util.Collection<? extends Dog> es)
这确保参数只能接受Dog and Dog的子类集合。因此,当您从集合中检索它时,可以安全地将检索对象分配给Dog。
警告不是因为你做错了什么。这是因为JSONArray继承了非参数化的Collection。随意压制它。
答案 3 :(得分:0)
从JSONArray
的文档中,它看起来像extends ArrayList
原始类型(它没有泛型类型参数)。这是处理非泛型遗留代码的一个示例,唯一的方法是确保JSONArray
期望接收一些String
然后禁止警告。
(修复它的真正方法是更新JSONArray
以使用泛型,但在此期间,您必须使用原始类型。)
答案 4 :(得分:0)
使用Gson库将ArrayList
转换为JsonArray
。
Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();