CodeHS中Fraction类实现Comparable接口时equals方法合规性问题
问题:CodeHS中Fraction类equals方法被判定未实现的问题
我在CodeHS的练习里实现了一个实现Comparable接口的Fraction类,用来比较两个分数是否相等。代码能正常运行,但系统提示我没实现.equals方法,可我已经按作业要求写了equals方法——判断参数是Fraction实例且compareTo返回0。我试过替换相等运算符但编译失败,搞不清问题出在哪。
问题分析与解决方案
核心问题点
- equals方法的覆盖标识缺失:虽然你写了equals方法,但没有加上
@Override注解,部分严格的检查器(比如CodeHS的)可能无法识别这是覆盖了Object类的equals方法,从而判定未实现。 - compareTo方法修改了原对象状态:你的compareTo方法里直接修改了当前对象的
num成员(比如num *= (den2 / den);),这会导致调用equals后原分数被篡改,既不符合Comparable接口的规范(比较不应修改对象状态),也可能引发后续逻辑错误。 - 可选但必要的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
相关产品推荐
相关产品推荐

