问题描述
信封:JDK 7
{
JSONArray refJSONArray = getSomeJSON. --returns a json array.
for (Serializable refJSON : refJSONArray);
}
JSONArray
是自定义的。
{
public class JSONArray extends ArrayList<Serializable>
}
它是序列化对象的arraylist
。
我已经重写了Arraylist
的get方法,并具有自定义逻辑来隐蔽一些对象。
这段代码在jdk 6
上运行良好。
我们最近已升级到jdk 7
并获得了一个class cast exception
强制转换class cast exception
。
java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to mypackage.utils.JSONObject.
Obsrevations:正常的for循环
{
for (int i=0 ; i<jsonarray; i ++)
}
这确实会调用覆盖的GET
方法并进行所需的转换。
在将旧版for循环替换为增强循环时。 被覆盖的方法没有被调用。
我想知道为什么 ?
1楼
您正在比较的影响
for (int i = 0; i < list.size(); i++) {
final JSONObject o = list.get(i);
...
}
随着以下
for (JSONObject o : list) { ... }
而且您说您的自定义ArrayList
仅覆盖get
。
上面描绘了一个完美一致的画面,因为增强的for循环扩展为
for (Iterator it = list.iterator(); it.hasNext();) {
final JOSNObject o = it.next();
...
}
因此,它不涉及ArrayList
的get
方法。
通过重写ArrayList
的iterator()
方法来解决此问题,该方法现在必须提供自定义的Iterator
。
仅供参考,如果您使用的是Java 8,可以使用Streams表达式很好地解决。