函数引用的类型
Kotlin 支持几种类型的函数引用:
- 引用顶层函数: ::topLevelFunction
- 引用成员函数: ::memberFunction (需要一个对象实例来调用)
- 引用扩展函数: ::extensionFunction (需要一个接收者对象)
- 引用构造函数: ::ClassName 或 ClassName::class.constructors.first() (对于特定的构造函数)
- 引用属性: ::propertyName (可以是 val 或 var)
- 引用绑定成员引用: 使用 object : SomeInterface { ... }::someMethod 的形式,创建一个绑定到特定对象实例的成员函数引用. 这在需要引用特定对象实例的成员函数时很有用,即使该对象实例在创建函数引用后可能会更改。
如何创建函数引用
使用 :: 运算符后跟函数或属性的名称来创建函数引用。
示例
fun topLevelFunction(x: Int, y: Int): Int = x + y
class MyClass {
fun memberFunction(s: String): Int = s.length
fun double(x: Int): Int = x * 2
}
fun String.extensionFunction(): Int = this.length
val myProperty: Int = 42
fun main() {
// 引用顶层函数
val sum: (Int, Int) -> Int = ::topLevelFunction
println(sum(1, 2)) // 输出 3
// 引用成员函数
val obj = MyClass()
val length: (String) -> Int = obj::memberFunction
println(length("hello")) // 输出 5
// 引用扩展函数
val extLength: String.() -> Int = String::extensionFunction
println("world".extLength()) // 输出 5
// 引用构造函数
val createMyClass: () -> MyClass = ::MyClass
val newObj = createMyClass()
// 引用属性
val getProperty: () -> Int = ::myProperty
println(getProperty()) // 输出 42
// 引用绑定成员引用
val doubleFunction: (Int) -> Int = obj::double // 绑定到 obj 实例
println(doubleFunction(5)) // 输出 10
}