Kotlin 扩展函数和运算符重载

扩展函数

扩展函数表示即使在不修改某个类的源码的形况下,仍然可以打开这个类,向该类添加新的函数。扩展函数的语法结构:

fun ClassName.methodName(param1: Int, param2: Int): Int {
return 0
}

扩展函数可以定义在任何一个现有类中,建议向哪个类中添加扩展函数就定义一个同名的 Kotlin 文件,便于以后查找,最好定义为顶层方法,可以让扩展函数拥有全局的访问域。

运算符重载

运算符重载是 Kotlin 提供的一个比较有趣的语法糖。Kotlin 允许将所有的运算符甚至其他的关键字进行重载,从而扩展这些运算符和关键字的用法。

运算符重载使用 operator 关键字,只有在指定函数前加上 operator 关键字就可以实现运算符的重载功能,不同的运算符对应的重载函数也是不同的,以加号运算符为例:

class Obj {

operator fun plus(obj: Obj): Obj {
// 处理相加的逻辑
}

}

让两个 Money 对象相加或 Money 对象和数字相加:

class Money(val value: Int) {

operator fun plus(money: Money): Money {
val sum = value + money.value
return Money(sum)
}

operator fun plus(newValue: Int): Money {
val sum = value + newValue
return Money(sum)
}

}
语法糖表达式和实际调用函数对照表
语法糖表达式 实际调用函数
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b)
a++ a.inc()
a– a.dec()
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
a == b a.equals(b)
a > b
a < b
a >= b
a <= b
a.compareTo(b)
a..b a.rangeTo(b)
a[b] a.get(b)
a[b]=c a.set(b, c)
a in b b.contains(a)

实现 str * n 的写法表示让 str 字符串重复 n 次,可以向 String 类中添加扩展函数:

operator fun String.times(n: Int) = repeat(n)

参考