gpt4 book ai didi

java - 覆盖 equals() 方法以允许异构对象

转载 作者:行者123 更新时间:2023-11-29 03:52:33 25 4
gpt4 key购买 nike

下面是从 5 个类中的一个类中为该作业选择的代码。

每个类都必须有一个 equals() 方法,该方法可以将其类的对象与所有 5 个类的对象进行比较。

为了精确起见,我的策略是将每个对象值转换为 double 值。

由于每个类都扩展了 Number,每个类都有一个可以使用的 doubleValue() 方法。

除非我在执行 doubleValue() 之前将 x 类型转换为 RationalN,否则代码不会编译

但是当执行代码时,当另一个类的对象被比较时它会提示,因为它不能被类型转换为那个类。

我从这里去哪里?

        public class RationalN extends Number{
private int numerator;
private int denominator;

public RationalN(int x, int y){
if (y == 0){
throw new ArithmeticException("cannot devide by zero");
} else {
this.numerator=x;
this.denominator=y;
}
}

public double doubleValue(){
double value = (double)numerator/(double)denominator;
return (double)value;
}

public boolean equals(Object x){
if (((RationalN)x).doubleValue() == this.doubleValue()){
return true;
} else {
return false;
}
}

最佳答案

根据我从您的帖子中得到的信息,您想要检查 equals 您的对象表示的数值是否等于参数对象的数值。因此,比较类别是合适的。相反,您的 equals() 方法看起来也像这样:

public boolean equals(Object x) {
if(this == x)
return true;
if(x == null)
return false;
if(!(x instanceof Number))
return false;
Number n = (Number)x;
return (n.doubleValue() == this.doubleValue());
}

然而,这违反了 equals() 契约:new RationalN(1, 1).equals(new Integer(1)) 会返回 true,但是 new Integer(1).equals(new RationalN(1, 1));不会 - 上面的 equals() 方法违反了对称性。因此,引入一个实现 Number(例如 MyNumber)的抽象类是合适的,它由您的五个类扩展并以上述方式(使用 instanceof MyNumber)实现 equals()。

关于java - 覆盖 equals() 方法以允许异构对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com