我从https://stackoverflow.com/a/20445493/2848676知道以下代码提供错误type mismatch cannot convert from element type object to string
:
ArrayList objectArray = new ArrayList();
for (String str : objectArray) {
编译器在我的objectArray声明中给出了警告ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized
。这对我来说都很有意义。修复是指定泛型类型:
ArrayList<String> stringArray = new ArrayList<String>();
for (String str : stringArray) {
这可以避免编译器警告和编译错误。
我的问题是,我正在尝试迭代一个名为org.json.simple.JSONArray
的ArrayList的子类,而我无法控制如何实例化JSONArray。因此我没有在任何地方看到编译器警告,但我在这个for
循环代码行中得到了编译错误:
JSONArray insights = (JSONArray)jsonResult.get("insights");
for (JSONObject insightGroup : insights) {
我知道我可以这样解决这个问题:
JSONArray insights = (JSONArray)jsonResult.get("insights");
for (int i=0; i<insights.size(); i++) {
JSONObject insightGroup = (JSONObject) insights.get(i);
但有人可以解释泛型类型的细节吗?特别是,如何在不指定泛型类型的情况下实例化org.json.simple.JSONArray
? org.json.simple.JSONArray
设计得很差吗?或者我没有正确使用org.json.simple.JSONArray
?
答案 0 :(得分:2)
org.json.simple.JSONArray设计得不好吗?
在我看来,是的,但不是因为你所描述的原因。
JSON数组可以包含任何JSON值类型,而不仅仅是JSON对象。所以
for (JSONObject insightGroup : insights) {
不应该允许,并且不是。 JSONObject
类型表示JSON对象。但JSONArray
可以包含String
值,其他JSONArray
值,数值,null
或其他JSONObject
值。
JSON格式描述为here。
也许这就是JSONArray
被实施为扩展和实施原始List
类型的原因,which is typically not a good idea.
答案 1 :(得分:1)
是的,看起来JSONArray是一个ArrayList<Object>
。尝试创建ArrayList<JSONObject>
,如下所示:
// The json-simple way
ArrayList<JSONObject> jsonThings = (JSONArray)JSONValue.parse(jsonString);
for (JSONObject j : jsonThings) {
System.out.println("This is it: " + j.toJSONString());
}
或者在这样的地方演出:
for (Object j : jsonThings) {
System.out.println("This is it: " + ((JSONObject)j).toJSONString());
}