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

LiT*_*Tle 6 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
Run Code Online (Sandbox Code Playgroud)

为什么我get在声明lambda时不能调用(参见错误注释)?有什么区别lengthL1lenghtNL1

yol*_*ole 4

s::length是一个属性引用,它是KProperty1类型的对象。该get方法被定义为该类型的成员

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

  • 好吧,如果你声明 `val x: Any = "abc"`,你也将无法访问 `x.length`,所以我不明白为什么这会令人惊讶...... (3认同)