我正在阅读教程中的以下代码,但我并没有真正理解它 基本上它尝试使用运算符重载,以便以下代码工作:
return today + YEAR * 2 + WEEK * 3 + DAY * 5
我的理解:
这部分:
operator fun MyDate.plus(timeInterval: TimeInterval): MyDate {
return addTimeIntervals(timeInterval, 1)
}
增强课程MyDate
以支持+
timeInterval
,以便myDate + YEAR
例如operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval)
= addTimeIntervals(timeIntervals.timeInterval, timeIntervals.number)
。
这部分:
MyDate
使用*
RepeatedInterval
以支持timeInterval
这部分只声明一个包含2个成员变量number
和class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int)
的空类
RepeatedInterval
我不明白乘法是如何实际发生的
因为import TimeInterval.*
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int)
enum class TimeInterval { DAY, WEEK, YEAR }
operator fun MyDate.plus(timeInterval: TimeInterval): MyDate {
return addTimeIntervals(timeInterval, 1)
}
class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int)
operator fun TimeInterval.times(number: Int) = RepeatedTimeInterval(this, number)
operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval)
= addTimeIntervals(timeIntervals.timeInterval, timeIntervals.number)
fun task1(today: MyDate): MyDate {
return today + YEAR + WEEK
}
fun task2(today: MyDate): MyDate {
return today + YEAR * 2 + WEEK * 3 + DAY * 5
}
只是一个空类
请有人帮我理解这个吗?
import java.util.Calendar
fun MyDate.addTimeIntervals(timeInterval: TimeInterval, number: Int): MyDate {
val c = Calendar.getInstance()
c.set(year, month, dayOfMonth)
when (timeInterval) {
TimeInterval.DAY -> c.add(Calendar.DAY_OF_MONTH, number)
TimeInterval.WEEK -> c.add(Calendar.WEEK_OF_MONTH, number)
TimeInterval.YEAR -> c.add(Calendar.YEAR, number)
}
return MyDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE))
}
这也是本教程的一部分:
schema.org
答案 0 :(得分:2)
YEAR * 2
是TimeInterval * Int
。编译器认为它不是内置组合,因此它会在times
上查找标记为operator
的方法TimeInterval
,该方法接受Int
(例如{{1} }或TimeInterval.times(Int)
)。此方法可以是TimeInterval.times(Any)
的成员或扩展名;绝对没有理由成为TimeInterval
的成员。
事实上,RepeatedTimeInterval
根本没有解决RepeatedTimeInterval
的任何部分,它恰好是返回类型。然后YEAR * 2
为today + YEAR * 2
,同样的规则适用于挑选MyDate + RepeatedTimeInterval
(而不是用于operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval)
的{{1}})。
请注意,使用此代码,例如operator fun MyDate.plus(timeInterval: TimeInterval)
; 需要today + YEAR
,这也可能是会员或分机。