java equals覆盖_覆盖java equals()方法 – 不工作?

我今天遇到了一个有趣的(并且非常令人沮丧的)equals()方法的问题,导致我认为是一个经过良好测试的类崩溃并导致我花了很长时间才能追踪的错误.

为了完整起见,我没有使用IDE或调试器 – 只是老式的文本编辑器和System.out.时间非常有限,这是一个学校项目.

无论如何 –

我正在开发一个基本的购物车,它可以包含Book对象的ArrayList.为了实现Cart的addBook(),removeBook()和hasBook()方法,我想检查一下Book是否已经存在.我走了 –

public boolean equals(Book b) {

... // More code here - null checks

if (b.getID() == this.getID()) return true;

else return false;

}

一切都在测试中运行良好.我创建了6个对象并用数据填充它们.在Cart上做了很多添加,删除,has()操作,一切正常.我读到你可以有equals(TYPE var)或equals(Object o){(CAST)var}但是假设它既然有效,那也无关紧要.

然后我遇到了一个问题 – 我需要在Book类中创建一个只有ID的Book对象.不会输入任何其他数据.基本上如下:

public boolean hasBook(int i) {

Book b = new Book(i);

return hasBook(b);

}

public boolean hasBook(Book b) {

// .. more code here

return this.books.contains(b);

}

突然之间,equals(Book b)方法不再有效.这需要花费很长时间才能在没有良好调试器的情况下进行跟踪,并假设Cart类已经过适当的测试和更正.将equals()方法交换到以下内容后:

public boolean equals(Object o) {

Book b = (Book) o;

... // The rest goes here

}

一切都开始了.有没有理由该方法决定不采用Book参数,即使它显然是Book对象?唯一的区别似乎是它是在同一个类中实例化的,并且只填充了一个数据成员.我很困惑.请揭开一些光明?

解决方法:

在Java中,从Object继承的equals()方法是:

public boolean equals(Object other);

换句话说,参数必须是Object类型.

ArrayList使用正确的equals方法,在那里你总是调用那个没有正确覆盖Object的equals的方法.

不正确覆盖方法可能会导致问题.

我每次都重写等于以下内容:

@Override

public boolean equals(Object other){

if (other == null) return false;

if (other == this) return true;

if (!(other instanceof MyClass))return false;

MyClass otherMyClass = (MyClass)other;

...test other properties here...

}

使用@Override注释可以帮助实现愚蠢的错误.

只要您认为自己覆盖了超类或接口的方法,就可以使用它.这样,如果你做错了,你将收到编译错误.

标签:java,equals,overriding

来源: https://codeday.me/bug/20190911/1803478.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值