(反思)隐含和明确的lambda声明

时间:2018-03-07 08:46:42

标签: lambda kotlin kotlin-reflect

我试图理解反思。我有以下代码:

fun main(args: Array) {
println(lengthL1())
println(lengthL2(s))
println(lengthL1.get()) // Error
println(lengthL2.get(s)) // Error

println(lengthNL1.get())
println(lengthNL2.get(s))
println(lengthNL1())
println(lengthNL2(s))
}

val s = “1234”

val lengthL1: () -> Int = s::length
val lengthL2: (String) -> Int = String::length

val lengthNL1 = s::length
val lengthNL2 = String::length

为什么我在声明lambda时无法调用get(请参阅错误注释)? lengthL1lenghtNL1之间有什么区别吗?

1 个答案:

答案 0 :(得分:4)

s::length是属性引用,它是KProperty1类型的对象。 get方法定义为a member of this type

如果声明一个lambda类型的变量并使用属性引用初始化它,则会得到一个常规的lambda(KFunction1)。 KFunction1接口仅声明invoke()方法,允许您将其称为lengthL1(),但它不会声明任何其他方法,例如get