未定义rangeTo()时,Kotlin中MyDate的范围如何生成?
Kotlin中Comparable类的Range范围判断机制
为什么无需手动定义rangeOf?
Kotlin对所有实现Comparable接口的类,会自动支持..操作符——这个操作符本质是创建一个ClosedRange实例,不需要你手动实现rangeOf函数。
date in first..last的实际判断逻辑
in操作符在这里会调用ClosedRange.contains()方法,而这个方法的判断逻辑完全依赖你实现的compareTo方法:
- 只要
date.compareTo(first) >= 0(即date不早于first),并且date.compareTo(last) <= 0(即date不晚于last),就会返回true。
结合你的代码实例分析
你的MyDate类的compareTo是按年份优先,其次月份,最后日期的顺序做整体比较的:
MyDate(2014, 1, 1)和MyDate(2013, 12, 1)比较:年份2014大于2013,compareTo返回正数,满足>=0;- 和
MyDate(2014, 3, 1)比较:年份相同,月份1小于3,compareTo返回负数,满足<=0;
因此整体判断结果为true,和你运行代码得到的结果一致。
纠正你的误解
Kotlin不会为类的每个字段单独生成范围,而是把整个对象作为一个整体,通过你实现的compareTo逻辑做大小判断,进而确定是否在first..last这个闭合范围内。你之前设想的“按月份单独判断”是错误的,范围判断完全基于对象的整体比较结果,而非拆分字段分别判断。
内容的提问来源于stack exchange,提问作者Jason_L_Bens
相关产品推荐
相关产品推荐

