当前位置: 代码迷 >> java >> 增强的for循环不会调用arraylist的重写方法。 类广播异常
  详细解决方案

增强的for循环不会调用arraylist的重写方法。 类广播异常

热度:36   发布时间:2023-07-31 11:44:33.0

信封: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循环替换为增强循环时。 被覆盖的方法没有被调用。

我想知道为什么 ?

您正在比较的影响

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();
   ...
}

因此,它不涉及ArrayListget方法。

通过重写ArrayListiterator()方法来解决此问题,该方法现在必须提供自定义的Iterator

仅供参考,如果您使用的是Java 8,可以使用Streams表达式很好地解决。

  相关解决方案