假设我们有以下代码:
fun interface A {
fun a()
}
interface B {
fun b(a: A)
}
fun x(callback: A.() -> Unit) = object : B {
override fun b(a: A) {
a.callback()
//callback.invoke(a)
}
}
为什么我们可以使用a.callback()而不是callback.invoke(a) 这样的语法有什么意义呢?在官方文档中找不到它。 是的,这里 a.callback() 也相当于 (a as A).callback()
callback
的类型是带有接收器的函数类型。来自文档:
函数类型可以选择具有附加的 receiver 类型,该类型在符号中的点之前指定:类型
表示可以在接收者对象A.(B) -> C
上使用参数A
调用并返回价值B
。C
callback
是 A.() -> Unit
类型,因此可以在 A
的实例上调用它(即参数 a
)。
这与您通常调用扩展函数的方式类似。
callback
这里的作用就像A
上的扩展函数(因为它的类型是A.() -> Unit
),所以你可以像x
内部的扩展函数一样调用它。