作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我试图理解反射。我有以下代码:
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 类型的对象. get
方法定义为 a member of this type .
如果您声明一个 lambda 类型的变量并使用属性引用对其进行初始化,您将获得一个常规 lambda (KFunction1
)。 KFunction1
接口(interface)只声明了 invoke()
方法,允许你调用它为 lengthL1()
,但它没有声明任何额外的方法比如get
。
关于lambda - (反射(reflection))隐式和显式 lambda 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49147536/
我是一名优秀的程序员,十分优秀!