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
相关产品推荐
相关产品推荐

