这种写法为什么能行?


#1

代码

"hello kotlin".apply(::println)

输出

hello kotlin

#2

println参数数量和lambda是一致的,编译器自动转换


#3

说的没错。更本质一点儿的说法是,println 的类型为 (Any?) -> Unit,或者 Function<Any?, Unit>,而 apply 的参数类型是 T.() -> Unit,T 做为 receiver 的时候,类型等价于 (T)->Unit,而 T 因为没有任何约束,因此所有类型都可以,即 T: Any?。


#4

也就是说 T.() -> Unit 的形式会 转换为(T) -> Unit
在调用时把 this当作入参了

代码

"hello kotlin".apply(::println)

等价

"hello kotlin".apply {
    println(this)
}

能够这样理解吗?


#5

结果上等价,但代码角度,第二个会多创建一个 Lambda


京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务