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