Kotlin 扩展函数和运算符重载
扩展函数
扩展函数表示即使在不修改某个类的源码的形况下,仍然可以打开这个类,向该类添加新的函数。扩展函数的语法结构:
fun ClassName.methodName(param1: Int, param2: Int): Int { |
扩展函数可以定义在任何一个现有类中,建议向哪个类中添加扩展函数就定义一个同名的 Kotlin 文件,便于以后查找,最好定义为顶层方法,可以让扩展函数拥有全局的访问域。
运算符重载
运算符重载是 Kotlin 提供的一个比较有趣的语法糖。Kotlin 允许将所有的运算符甚至其他的关键字进行重载,从而扩展这些运算符和关键字的用法。
运算符重载使用 operator 关键字,只有在指定函数前加上 operator 关键字就可以实现运算符的重载功能,不同的运算符对应的重载函数也是不同的,以加号运算符为例:
class Obj { |
让两个 Money 对象相加或 Money 对象和数字相加:
class Money(val value: Int) { |
| 语法糖表达式 | 实际调用函数 |
|---|---|
| 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) |