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

Kotlin Koans比较习题:自定义compareTo为何报Unsupported unit: Seconds错误

Kotlin compareTo运算符重载实现错误原因分析

错误直接诱因

你遇到的Unsupported unit: Seconds异常和返回值类型无关,问题出在API选型错误:

  • Duration是Java Time中专门用于计算含时间维度对象(例如LocalDateTime、Instant、LocalTime)时间差的工具类,内部会默认按秒、纳秒维度计算差值。LocalDate仅包含年、月、日日期维度,没有秒级时间信息,传入Duration.between方法时就会直接抛出不支持秒单位的异常。
  • 如果要计算两个LocalDate的天数差,应该使用ChronoUnit.DAYS.between(startDate, endDate) 或者 LocalDate.until(ChronoUnit.DAYS) 这类专门针对日期维度的差值计算API。

方案优化建议

就算替换为正确的日期差值API,你的实现方案在这个习题场景下仍存在冗余:

  • Kotlin中compareTo方法的约定只要求返回三类值即可:负值代表当前对象小于参数对象、0代表二者相等、正值代表当前对象大于参数对象,不需要精确计算两个日期的间隔天数。
  • 官方参考实现按年、月、日依次比较差值返回的方案性能更高,不需要依赖Java Time API,也不会出现时区、历法相关的边界问题,实现更轻量可靠。
  • 符合习题要求的最简实现示例:
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
    override fun compareTo(other: MyDate): Int {
        if (year != other.year) return year - other.year
        if (month != other.month) return month - other.month
        return dayOfMonth - other.dayOfMonth
    }
}

实现上述代码后date1 < date2即可正常编译运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:02