Kotlin中的运算符重载以及此代码如何工作?

时间:2018-06-14 13:16:48

标签: kotlin

我正在阅读教程中的以下代码,但我并没有真正理解它 基本上它尝试使用运算符重载,以便以下代码工作:

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个成员变量numberclass 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

1 个答案:

答案 0 :(得分:2)

YEAR * 2TimeInterval * Int。编译器认为它不是内置组合,因此它会在times上查找标记为operator的方法TimeInterval,该方法接受Int(例如{{1} }或TimeInterval.times(Int))。此方法可以是TimeInterval.times(Any)的成员或扩展名;绝对没有理由成为TimeInterval的成员。

事实上,RepeatedTimeInterval根本没有解决RepeatedTimeInterval的任何部分,它恰好是返回类型。然后YEAR * 2today + YEAR * 2,同样的规则适用于挑选MyDate + RepeatedTimeInterval(而不是用于operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval)的{​​{1}})。

请注意,使用此代码,例如operator fun MyDate.plus(timeInterval: TimeInterval); 需要today + YEAR,这也可能是会员或分机。