我知道,类型转换不是正确的词,当
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-each
。 for-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/