从Collection <?删除项目?扩展MyObject> UnsupportedOperationException

Ste*_*ike 3 java generics collections

我的功能出了问题.该代码对我来说非常好,它在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();
  }
}
}
Run Code Online (Sandbox Code Playgroud)

我希望将函数用于类型的对象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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以使用CollectionsType CarPlan和调用函数ShipPlan

doRemoveAusgefallenePlaene(pAllCarPlan);
doRemoveAusgefallenePlaene(pAllShipPlan);
Run Code Online (Sandbox Code Playgroud)

并且代码编译没有问题.不幸的是,在执行时会抛出UnsupportedOperationException

lPlanIterator.remove();
Run Code Online (Sandbox Code Playgroud)

我认为通过声明我明白了解错误Collection<? extends Plan>.谁知道这个问题?

- 更新 - 对于那些对一种可能的解决方案感兴趣的人:

final List<CarPlan> lAllCarPlan = new ArrayList<CarPlan>(pAllCarPlan);
doRemoveAusgefallenePlaene(lAllCarPlan);
Run Code Online (Sandbox Code Playgroud)

ShipPlan和做得很好CarPlan.

Mar*_*ers 6

您可能正在迭代一个不可修改的集合,其迭代器因此不支持remove操作.

不可修改的集合的示例包括由其生成的集合Collections.unmodifiableXX().返回的列表Arrays.asList()不是完全不可修改的(您可以在特定索引处设置元素),但不支持添加或删除操作,因为它是由您传入的数组直接支持的.

来自Javadocremove():

抛出:UnsupportedOperationException- 如果此迭代器不支持remove操作

您需要查看传入的内容,并确保实际上可以修改集合的结构.您还没有向我们展示该代码.