我知道,类型转换不是正确的词,当

java.lang.Object
  -> java.util.concurrent.CopyOnWriteArrayList<E>


java.lang.Object
  -> java.util.AbstractCollection<E>
      -> java.util.AbstractList<E>
          -> java.util.ArrayList<E>

但我想要的是将 CopyOnWriteArrayList 的行为添加到 ArrayList

例如:
我想做以下。但是 tstArry 是一个 ArrayList 。不是 CopyOnWriteArrayList
for(TestCls testCls : tstArry)
    if(testCls.getVal1().equals("a1"))
        tstArry.remove(testCls);

或者这是完成工作的唯一方法?
for(int i = 0; i < tstArry.size(); i++)
    if(tstArry.get(i).getVal1().equals("a1"))
        tstArry.remove(i--);

tstArry 是一个来自我没有控制权的类的 ArrayList。
因此,请将 ArrayList 的类型更改为另一种是最有效的解决方案。

最佳答案

使用增强的 remove() 循环时,您不能从迭代集合中获取 for-eachfor-each 循环隐式地使用 Iterator<TestCls> JavaDoc 明确指出


for-each 循环在内部创建一个迭代器并使用它来遍历列表。然后你改变列表的结构......迭代器必须失败。问题是您无权访问迭代器方法,因此您必须明确使用 Iterator<TestCls>。生成的遍历字节码将是相同的,唯一的区别是您可以在遍历列表时从列表中删除元素。

for (Iterator<TestCls> iter = tstArry.iterator(); iter.hasNext(); ) {
    TextCls testCls = iter.next();
    if(testCls.getVal1().equals("a1")) {
        iter.remove();
    }
}

澄清 EDIT,因为您显然不熟悉迭代器及其功能。来自 the Oracle tutorial on Collections :

关于java - "CAST"ArrayList 有什么方法可以复制到 CopyOnWriteArrayList,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17231022/

10-09 05:02