【问题标题】:(Reflection) Implicit and explicit lambda declaration(反思)隐式和显式 lambda 声明
【发布时间】:2018-03-07 08:46:42
【问题描述】:

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

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(请参阅错误 cmets)? lengthL1lenghtNL1有区别吗?

【问题讨论】:

    标签: lambda kotlin kotlin-reflect


    【解决方案1】:

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

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

    【讨论】:

    • 我没想到只声明 lambda 类型会有这么大的变化!声明类型与否我认为它没有效果!
    • 好吧,如果你声明val x: Any = "abc",你也将无法访问x.length,所以我不明白这究竟为什么令人惊讶......
    • 我要换类型了!我从来没想过!感觉很尴尬!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2016-03-06
    相关资源
    最近更新 更多