重写Comparable接口compareTo方法时调用String类compareTo的疑问确认
StockItem类compareTo调用逻辑澄清
核心结论
你的理解完全正确,代码中出现的两个compareTo分属不同类的不同方法,既不会触发递归调用,也不会误调用父类的同签名方法。
两个compareTo的本质区别
- 带
@Override注解的重写方法:是StockItem类实现Comparable<StockItem>接口时必须覆写的方法,方法签名为public int compareTo(StockItem o),入参类型为StockItem,作用是定义两个库存条目的排序规则。 - 方法体内实际调用的compareTo:调用发起方是
this.itemName属性,该属性类型为String,因此触发的是String类自带的compareTo方法,方法签名为public int compareTo(String anotherString),入参类型为String,和StockItem的compareTo签名、所属类完全不同。
为什么不会出现递归/误调父类的认知误区
Java的实例方法调用遵循谁发起调用,就执行谁所属类的对应方法的规则:
你写的return this.itemName.compareTo(o.getItemName())本质是先取出当前对象的商品名字符串、再取出入参对象的商品名字符串,最后执行两个字符串的比较逻辑,全程没有对StockItem类自身的实例发起compareTo调用,自然不存在递归的可能。
只有当你显式写出super.compareTo(...)时,才会触发父类继承来的同签名compareTo方法,当前代码没有这类调用,自然不会走到父类的方法逻辑里。
额外提一句你当前代码的小问题:现在的空值判断分支下没有写返回逻辑,如果传入的
o是null,方法执行完if判断块之后没有任何返回值,会直接触发“缺少返回语句”的编译报错。调整的时候可以按照通用的排序约定,检测到o为null时返回1(代表非空对象永远排在null前面),再走字符串比较的逻辑即可。
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

