06-构造函数引用
10.1.5 构造函数引用
构造函数的引用和属性、方法类似,构造函数可以作用于任何函数类型的对象,该函数的对象与构造函数的参数相同,可以使用::操作符加类名的方式来引用构造函数。
class Foo
fun function(factory: () -> Foo) {
val x: Foo = factory()
}
//使用 ::Foo方式调用类 Foo的零参数构造函数
fun main(args: Array<String>) {
function(::Foo)
}
自1.1版本开始,Kotlin允许构造函数引用特定对象的实例方法。代码如下。
val numberRegex = "\\d+".toRegex()
println(numberRegex.matches("29")) //输出true
//使用构造方法引用取代直接调用方法matches
val isNumber = numberRegex::matches
println(isNumber("29")) // 输出true
当构造函数引用和属性引用绑定后,属性的引用就会绑定到接收者上,这样就可以直接调用了。
val numberRegex = "\\d+".toRegex()
val strings = listOf("abc", "124", "a70")
println(strings.filter(numberRegex::matches)) //输出 [124]
通过对比绑定类型和没有绑定类型的引用可以发现,被绑定的引用有自己的接收器,而且这个接收器可能含有多个参数。
val isNumber: (CharSequence) -> Boolean = numberRegex::matches
val matches: (Regex, CharSequence) -> Boolean = Regex::matches
除此之外,属性引用也同样可以被绑定。
val prop = "abc"::length
println(prop.get()) // 输出3
同时,自1.2版本开始,Kotlin的构造函数无须显式指定this作为接收者。