当前位置:嗨网首页>书籍在线阅读

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作为接收者。