Java中继承Comparator实现类的子类如何正确重写compare方法
问题原因
- 你在
Manager类中定义的compare(Manager a, Manager b)是方法重载,不是对父类Comparator<Employee>接口方法的重写- 父类实现的
Comparator<Employee>接口要求的方法签名是public int compare(Employee o1, Employee o2),子类方法的参数是Manager类型,和接口要求的参数类型不匹配,因此不属于接口实现,自然不会被接口调用。这也是你去掉public修饰符也不会报错的原因:它根本就不是接口方法的实现,不需要满足接口方法的访问权限要求。
- 父类实现的
- 测试代码中的变量
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
相关产品推荐
相关产品推荐

