Kotlin里面 函数是一种类型(函数类型) 也是一种对象(函数对象)
在函数名前加双冒号(::)即为此函数的函数对象
扩展函数对象的调用方法
fun String.a() {
TODO()
}
fun test() {
String::a.invoke("xxx")
(String::a)("xxx")
}
将扩展函数以对象的方式调用时 把接受者参数(Receiver)放在第一个参数位置
扩展函数 和 一般函数 是可以互相转换的 且 函数参数可自动转换
- 互相转换
fun a(str: String): Unit {
TODO()
}
fun String.b(): Unit {
TODO()
}
val c: String.() -> Unit = ::a //a是一般函数赋值给扩展函数c
val d: (String) -> Unit = String::b //b是扩展函数赋值给一般函数d
- 自动转换
fun a(str: String): Unit {
TODO()
}
fun String.b(): Unit {
TODO()
}
fun c(block: (String) -> Unit) {
TODO()
}
fun d(block: String.() -> Unit) {
TODO()
}
fun String.e(block: (String) -> Unit) {
TODO()
}
fun String.f(block: String.() -> Unit) {
TODO()
}
fun test() {
c(::a)
c(String::b) //高阶函数c的参数类型为一般函数 这里传入的是扩展函数
d(::a) //高阶函数d的参数类型为扩展函数 这里传入的是一般函数
d(String::b)
"str".e(::a)
"str".e(String::b) //高阶函数e的参数类型为一般函数 这里传入的是扩展函数
"str".f(::a) //高阶函数f的参数类型为扩展函数 这里传入的是一般函数
"str".f(String::b)
}
Tips:
高阶函数: 如果函数a的参数类型或者返回值类型是函数类型的时候 这个a函数被称为高阶函数