(反射)隐式和显式 lambda 声明
(Reflection) Implicit and explicit lambda declaration
我正在尝试理解反射。我有以下代码:
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
(请参阅错误注释)?
lengthL1
和lenghtNL1
有区别吗?
s::length
是一个 属性 引用,它是一个 KProperty1. The get
method is defined as a member of this type.
类型的对象
如果您声明一个 lambda 类型的变量并使用 属性 引用对其进行初始化,您将获得一个常规的 lambda (KFunction1
)。 KFunction1
接口仅声明了 invoke()
方法,允许您将其调用为 lengthL1()
,但它没有声明任何其他方法,例如 get
.
我正在尝试理解反射。我有以下代码:
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
(请参阅错误注释)?
lengthL1
和lenghtNL1
有区别吗?
s::length
是一个 属性 引用,它是一个 KProperty1. The get
method is defined as a member of this type.
如果您声明一个 lambda 类型的变量并使用 属性 引用对其进行初始化,您将获得一个常规的 lambda (KFunction1
)。 KFunction1
接口仅声明了 invoke()
方法,允许您将其调用为 lengthL1()
,但它没有声明任何其他方法,例如 get
.