1. 介绍
本文深入介绍下 Kotlin 中的 ::
运算符,也称为可调用引用运算符,用于创建成员引用或类引用。可以让开发者用非常简洁的方式引用类、函数、属性和构造函数。
::
操作符是创建指向成员或类的引用,而不直接调用它们。
2. ::
操作符创建引用的分类和用法
2.1 类引用
获取 Kotlin 类的引用,该引用是一个 KClass 类型值
val c = MyClass::class
Kotlin 类引用与 Java 类引用不同。要获取 Java 类引用,请使用 KClass
实例上的 .java
属性。
val jc = MyClass::class.java
2.2 可调用引用
对函数、属性和构造函数的引用也可以被调用或作为函数类型的实例。
所有可调用引用的公共超类型是 KCallable,其中 R 是返回值类型。对于属性来说它是属性类型,对于构造函数来说它是构造类型。
2.2.1 函数引用
函数引用属于 KFunction 类型,它是 KCallable 类型的子类
声明函数时,可以直接调用它(isOdd(5)
):
fun isOdd(x: Int) = x % 2 != 0
也可以使用 ::
运算符将函数用作函数类型的值,将其传递给另一个函数。
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))
也可以通过引用运算符创建引用类型的值,需要时再调用
fun greeting(name: String) {
println("Hello, $name!")
}
val websiteGreeting = ::greeting
fun main() {
websiteGreeting("https://itmob.cn")
}
2.2.2 属性引用
可调用引用也适用于属性。
val x = 1
fun main() {
println(::x.get())
println(::x.name)
}
::x 返回结果为 KProperty 类型的属性对象。您可以使用 get()
读取其值或使用 name
属性获取属性名称。
2.2.3 构造函数引用
可调用引用也适用于构造函数。构造函数可以像方法和属性一样被引用。只要程序需要一个函数类型对象,该对象采用与构造函数相同的参数并返回适当类型的对象,您就可以使用它们。
使用 :: 运算符并添加类名来引用构造函数:
class Foo
fun function(factory: () -> Foo) {
val x: Foo = factory()
}
fun main() {
function(::Foo)
}
3. 在高阶函数中使用可调用引用
当与高阶函数(将其他函数作为参数或返回值的函数)一起使用时,可调用引用让函数调用更加方便。
fun greeting() {
println("Hello, https://itmob.cn")
}
fun doSomething(action: () -> Unit) {
action()
// TODO do something else
}
fun main() {
doSomething(::greeting)
}