如何正确覆盖ArrayList .remove()方法

时间:2018-04-27 13:51:22

标签: java arraylist

我需要覆盖客户端ArrayList中的add()和remove()方法。

如果我添加或删除客户端,则必须自动更新列表中客户端的订单总和。

其实我有这样的事情:

public class Path {
  private ArrayList<Client> clients = new ArrayList<Client>() {
    @Override
    public boolean add(Client e) {
      boolean allOk = super.add(e);
      if (allOk)
        calcTotalOrder();
      return allOk;
    }
    @Override
    public boolean remove(Client e) {
      boolean allOk = super.remove(e);
      if (allOk)
        calcTotalOrder();
      return allOk;
    }
  };
}

覆盖add()方法时我没有问题,它实际上完全符合我的要求,但与remove()的运气不一样。

我收到以下错误:&#34; new ArrayList(){}类型的remove(Client)方法必须覆盖或实现超类型方法&#34;。

Eclipse的提议是消除@Override

我做错了什么?

5 个答案:

答案 0 :(得分:1)

由于历史原因,Object方法不是多态的,即它必须支持删除任意T而不是remove()类型的对象。

但是,您必须记住也要覆盖相应的迭代器方法(因为调用ArrayList不是将事物添加到set()中的唯一方法),以及修改的所有其他方法集合中的元素(即@SU)。

答案 1 :(得分:1)

替换

public boolean remove(Object e)

通过

vector[K] x;

答案 2 :(得分:1)

如果你看一下java.util.ArrayList,它有两种删除方法:

public boolean remove(Object o)

public boolean remove(int index)

您需要覆盖这些方法。此外,列表迭代器也可以删除元素,如果需要完全删除支持,则必须覆盖列表迭代器。

答案 3 :(得分:0)

覆盖方法时,签名必须相同。否则,你不会压倒一切。您只需转到List实现并查看您尝试覆盖的方法即可。在您的情况下,它是removeadd。您会发现方法签名不会将Client对象作为参数。相反,它需要Object作为参数。

要覆盖,您必须维护方法签名。 Object是所有java对象的超类,错误“必须覆盖或实现超类型方法”只是告诉您正在使用@Override注释,而不实际覆盖任何内容。

答案 4 :(得分:0)

您可以将删除更改为对象,它将起作用,因为删除了一个对象。如果有人使用不同的方式添加对象,您将遇到问题。像addAll()或从集合构造函数创建一个ArrayList。

为了使用它而不是修改ArrayList方法,您可以将ArrayList扩展为“可以计算顺序的ArrayList”。类似的东西:

class ArrayListThatCalculatesTotalOrder extends ArrayList<Client>{
     .... your private calcTotalOrder() methods is here ....
    public TotalOrder getTotalOrder(){
        calcTotalOrder();
        return totalOrder;
    }
}

通过这种方式,您可以自由地将其用作列表,但您也可以通过标准方式使用简单的getter获取计算的总订单。或类似的东西取决于你究竟需要什么。添加行为比修改现有行为更好。