Java 如何正确重写ArrayList.remove()方法

Java 如何正确重写ArrayList.remove()方法,java,arraylist,Java,Arraylist,我需要覆盖客户端的ArrayList中的add()和remove()方法 如果添加或删除客户机,列表中客户机的订单总数必须自动更新 实际上我有这样的东西: public class Path { private ArrayList<Client> clients = new ArrayList<Client>() { @Override public boolean add(Client e) { boolean allOk = super

我需要覆盖客户端的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;
    }
  };
}
公共类路径{
私有ArrayList客户端=新ArrayList(){
@凌驾
公共布尔添加(客户端e){
布尔allOk=super.add(e);
如果(allOk)
calcTotalOrder();
返回allOk;
}
@凌驾
公共布尔删除(客户端e){
布尔allOk=super.remove(e);
如果(allOk)
calcTotalOrder();
返回allOk;
}
};
}
我在重写add()方法时没有问题,它实际上完全按照我所希望的方式工作,但与remove()的情况不同

我得到以下错误:“new ArrayList(){}类型的方法remove(Client)必须重写或实现超类型方法”

Eclipse的建议是消除@Override


我做错了什么?

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

但是,您必须记住还要重写相应的迭代器方法(因为调用
remove()
并不是将内容添加到
ArrayList
中的唯一方法),以及修改集合中元素的所有其他方法(即
set()
)。

Replace

public boolean remove(Client e)


如果查看
java.util.ArrayList
,它有两个删除方法:

public boolean remove(Object o)

public boolean remove(int index)

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

重写方法时,签名必须相同。否则,您不会覆盖。您只需转到
列表
实现,查看您试图覆盖的方法。在您的情况下,它是
删除
添加
。您会发现方法签名没有将
客户机
对象作为参数。相反,它将
对象
作为参数


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

您可以将该remove更改为Object,因为remove需要对象,所以它可以工作。不过,如果有人使用不同的方式添加对象,您将遇到问题。例如addAll()或从集合构造函数创建ArrayList

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

class ArrayListThatCalculatesTotalOrder extends ArrayList<Client>{
     .... your private calcTotalOrder() methods is here ....
    public TotalOrder getTotalOrder(){
        calcTotalOrder();
        return totalOrder;
    }
}
CalculatesTotalOrder类ArrayList扩展了ArrayList{
..您的私有calcTotalOrder()方法在这里。。。。
公共TotalOrder getTotalOrder(){
calcTotalOrder();
返回totalOrder;
}
}

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

remove
不使用泛型,并接受
对象
参数,方法的签名是
公共布尔删除(Object obj)
。错误是因为
ArrayList::remove
接受
对象
。也就是说,您可能不想将
ArrayList子类化;您可能希望改为委托给它,并让执行委托的方法中存在的代码
calcTotalOrder
。@PM77-1-看起来ArrayList declarationremove(int index)中有一个代码块实际返回已删除的对象,而不是布尔值
class ArrayListThatCalculatesTotalOrder extends ArrayList<Client>{
     .... your private calcTotalOrder() methods is here ....
    public TotalOrder getTotalOrder(){
        calcTotalOrder();
        return totalOrder;
    }
}