lambda - (反射(reflection))隐式和显式 lambda 声明

标签 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 有什么区别吗?

最佳答案

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

如果您声明一个 lambda 类型的变量并使用属性引用对其进行初始化,您将获得一个常规 lambda (KFunction1)。 KFunction1 接口(interface)只声明了 invoke() 方法,允许你调用它为 lengthL1(),但它没有声明任何额外的方法比如get

关于lambda - (反射(reflection))隐式和显式 lambda 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49147536/

相关文章:

c++ - 继承函数的重载解决方案

kotlin - 在 Kotlin 回调流程构建器中捕获异常

kotlin - 热衷于通过 Kotlin Reflection API 获取无参数构造函数?

kotlin - 如何获取 KmutableProperty i Kotlin 的容器?

java - 如何为 Java 调用者声明返回类型为 'void' 的 Kotlin Lambda?

c# - 条件 Lambda 表达式?

python - NLTK和下载的Chaquopy问题

python从列表中返回连续整数列表

android - 为什么在创建自定义启动画面时会收到警告?