You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeHS中Fraction类实现Comparable接口时equals方法合规性问题

问题:CodeHS中Fraction类equals方法被判定未实现的问题

我在CodeHS的练习里实现了一个实现Comparable接口的Fraction类,用来比较两个分数是否相等。代码能正常运行,但系统提示我没实现.equals方法,可我已经按作业要求写了equals方法——判断参数是Fraction实例且compareTo返回0。我试过替换相等运算符但编译失败,搞不清问题出在哪。

问题分析与解决方案

核心问题点

  1. equals方法的覆盖标识缺失:虽然你写了equals方法,但没有加上@Override注解,部分严格的检查器(比如CodeHS的)可能无法识别这是覆盖了Object类的equals方法,从而判定未实现。
  2. compareTo方法修改了原对象状态:你的compareTo方法里直接修改了当前对象的num成员(比如num *= (den2 / den);),这会导致调用equals后原分数被篡改,既不符合Comparable接口的规范(比较不应修改对象状态),也可能引发后续逻辑错误。
  3. 可选但必要的hashCode实现:根据Java规范,重写equals时必须同步重写hashCode,否则会导致集合类(如HashMap)使用时出现异常,这也可能是检查器的隐性要求。

修改后的代码

public class Fraction implements Comparable<Fraction>
{
    private int num;
    private int den;
        
    public Fraction(int numerator, int denominator)
    {
        num = numerator;
        den = denominator;
    }
    
    @Override
    public int compareTo(Fraction other)
    {
        // 用临时变量计算交叉乘积,不修改原对象成员
        long thisProduct = (long) num * other.getDenominator();
        long otherProduct = (long) other.getNumerator() * den;
        
        return Long.compare(thisProduct, otherProduct);
    }
    
    @Override
    public boolean equals(Object other)
    {
        if (this == other) return true; // 同一对象直接返回true,优化性能
        if (!(other instanceof Fraction)) return false;
        
        return compareTo((Fraction) other) == 0;
    }
    
    @Override
    public int hashCode() {
        // 基于分数的交叉乘积生成哈希值,保证与equals一致
        return Long.hashCode((long) num * den);
    }
    
    public int getNumerator() {
        return num;
    }
    
    public int getDenominator() {
        return den;
    }
    
    public void setNumerator(int x) {
        num = x;
    }
    
    public void setDenominator(int x) {
        den = x;
    }
    
    @Override
    public String toString() {
        return num + "/" + den;
    }
}

修改说明

  • 给equals、compareTo、toString都加上@Override注解,明确告知编译器这是覆盖父类的方法,让CodeHS的检查器能正确识别equals方法的实现。
  • 重构compareTo方法,使用临时变量计算交叉乘积,避免修改原对象的状态,符合Comparable接口的设计规范,同时逻辑更简洁,还能避免整数溢出问题(用long类型存储乘积)。
  • 添加hashCode方法,保证与equals方法的一致性,满足Java规范要求。
  • 在equals方法中增加同一对象的判断,提升比较性能。

内容的提问来源于stack exchange,提问作者Sumlina Alam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:53:26