我的功能出了问题。 该代码对我来说非常好,它在boolean属性为true时删除了一个项目:
private void doRemoveAusgefallenePlaene(Collection<CarPlan> pAllCarPlan) {
for (Iterator<CarPlan> lCarPlanIterator = pAllCarPlan.iterator(); lCarPlanIterator.hasNext();) {
CarPlan lCarPlan = lCarPlanIterator.next();
if (!lCarPlan.isAusfall()) {
lCarPlanIterator.remove();
}
}
}
我希望将函数用于CarPlan
类型的对象以及ShipPlan
(两者都实现接口Plan
)。
private void doRemoveAusgefallenePlaene(Collection<? extends Plan> pAllPlan) {
for (Iterator<? extends Plan> lIterator = pAllPlan.iterator(); lPlanIterator.hasNext();) {
Plan lPlan = lPlanIterator.next();
if (!lPlan.isAusfall()) {
lPlanIterator.remove();
}
}
}
现在我可以使用Collections
CarPlan
和ShipPlan
doRemoveAusgefallenePlaene(pAllCarPlan);
doRemoveAusgefallenePlaene(pAllShipPlan);
来调用该函数
lPlanIterator.remove();
并且代码编译没有问题。不幸的是,在执行时会抛出UnsupportedOperationException行
Collection<? extends Plan>
我认为我通过声明final List<CarPlan> lAllCarPlan = new ArrayList<CarPlan>(pAllCarPlan);
doRemoveAusgefallenePlaene(lAllCarPlan);
来理解错误。
知道任何人的问题吗?
- 更新 - 对于那些对一种可能的解决方案感兴趣的人:
ShipPlan
适用于CarPlan
和{{1}}。
答案 0 :(得分:6)
你可能正在迭代一个不可修改的集合,它的迭代器因此不支持remove操作。
不可修改的集合示例包括Collections.unmodifiableXX()
生成的集合。 Arrays.asList()
返回的列表不是完全不可修改的(您可以在特定索引处设置元素),但不支持添加或删除操作,因为它是由您传入的数组直接支持的。
抛出:
UnsupportedOperationException
- 如果此迭代器不支持remove操作
您需要查看传入的内容,并确保实际上可以修改集合的结构。您尚未向我们展示该代码。
答案 1 :(得分:2)
来自@dmeister的其他回复:Why aren't Java Collections remove methods generic?
Josh Bloch和Bill Pugh在“Java Puzzlers IV:The 幻影参考威胁,克隆人的攻击和复仇 Shift“(Google TechTalk)。
Josh Bloch说(6:41)他们试图使get方法变得一致 Map,删除方法和其他一些,但“它根本不起作用”。 如果有太多合理的程序无法通知 您只允许集合的泛型类型作为参数类型。 他给出的例子是数字列表和a的交集 Longs列表。