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

Java中继承Comparator实现类的子类如何正确重写compare方法

问题原因

  1. 你在Manager类中定义的compare(Manager a, Manager b)是方法重载,不是对父类Comparator<Employee>接口方法的重写
    • 父类实现的Comparator<Employee>接口要求的方法签名是public int compare(Employee o1, Employee o2),子类方法的参数是Manager类型,和接口要求的参数类型不匹配,因此不属于接口实现,自然不会被接口调用。这也是你去掉public修饰符也不会报错的原因:它根本就不是接口方法的实现,不需要满足接口方法的访问权限要求。
  2. 测试代码中的变量cm声明类型是Comparator<Employee>,Java调用方法时会先根据变量的静态类型匹配方法签名:
    • 只能匹配到签名为compare(Employee, Employee)的方法,也就是父类Employee中按薪资比较的实现,子类中参数为Manager的重载方法完全不会被匹配到,因此最终执行的是薪资比较逻辑,返回0。

解决方案

如果要让Manager实例按bonus比较,可以重写父类的接口方法,示例如下:

class Manager extends Employee {
  private Integer bonus;
  Manager (String n, int s, Integer b)  {
    super(n, s);
    this.bonus = b;
  }

  @Override 
  public int compare (Employee a, Employee b)  {
    // 先校验传入的参数是否是Manager类型
    if (a instanceof Manager && b instanceof Manager) {
      return ((Manager)a).bonus.compareTo(((Manager)b).bonus);
    }
    // 非Manager类型的比较可以走父类逻辑,也可以按业务需求抛异常
    return super.compare(a, b);
  }
}

补充设计建议:一般不建议让业务实体类本身实现Comparator接口,更合理的做法是单独定义比较器类,比如EmployeeSalaryComparator、ManagerBonusComparator,逻辑拆分更清晰,也不会遇到继承导致的方法匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:54:04