覆盖equals方法时,我们只使用'Object obj'作为参数吗?

And*_*tes 4 java overriding equals

我的任务是:

在Rational Numbers类中适当地重写equals()和hashCode()方法.

它进一步扩展了这一点.我的问题是,当你覆盖equals方法时,你是否更改了传入的参数?如果它检查逻辑等价,那么我已经完成了以下操作:

public boolean equals(Rational rhs){
    if(this.num == rhs.num && this.denom == rhs.denom){
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是覆盖方法时的方法.如果是,那么当你重写hashcode方法时,选择一段好的代码来分配哈希码只是一个简单的工作吗?

另外,这是我创建的哈希码.这是沿着正确的方向吗?

@Override
public int hashCode(){
    int hc = 17;
    hc = 37 * hc + ((num == 0 && denom == 0) ? 0 : num);
    return 37 * hc + denom;


    //boolean b = cond ? boolExpr1 : boolExpr2;
    //if cond true then b=boolExpr1 else b=boolExpr2
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 9

你的equals方法不覆盖Objectequals.为了覆盖它,参数必须是a Object.

@Override
public boolean equals(Object other){
    if (!(other instanceof Rational))
        return false;
    Rational rhs = (Rational) other;
    if(this.num == rhs.num && this.denom == rhs.denom){
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

请注意,@Override注释可帮助您检测您要覆盖方法但重载它的情况.如果将该注释放在原始方法中,则会出现编译错误,因为您的方法没有覆盖任何方法(假设您的Rational类没有扩展或实现某个包含boolean equals(Rational rhs)方法的类/接口).


Pet*_*rey 5

你可以这样做,因为这不会覆盖equals(Object)你仍然需要这样做

public boolean equals(Object o) {
    return o instanceof Rational && equals((Rational) o);
}
Run Code Online (Sandbox Code Playgroud)

原因equals(Object)是你可能有许多不同类型的集合.

List list = Arrays.asList(1, "Hello", new Rational(1, 2));
// needs to be able to compare with 1 and "Hello"
list.contains(new Rational(1, 2)); 
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1270 次

最近记录:

9 年,8 月 前