首页 文章

为什么必须使用invoke调用类成员函数类型?

提问于
浏览
6
fun test() {
    class Test(val foo: ((Double, Double) -> Double)?)
    val test = Test(null)

    if(test.foo != null) test.foo(1.0, 2.0)
}

上面的代码生成错误:

Kotlin:Reference有一个可空的类型'((Double,Double) - > DoubleArray)?',使用显式'? . invoke()'来代替类似函数的调用 .

如果我按照错误建议并将调用更改为 test.foo?.invoke(1.0, 2.0) ,则代码编译但IntelliJ现在报告

对'((Double,Double) - > DoubleArray)类型的非null接收器进行不必要的安全调用

根据这个建议,我最终得到 test.foo.invoke(1.0, 2.0) ,我认为它可以与 test.foo(1.0, 2.0) 互换;为什么不是这里的情况?

当foo不是类成员时,事情就像我期望的那样:

fun test2() {
    val foo: ((Double, Double) -> Double)? = null

    if(foo != null) foo(1.0, 2.0)
}

2 回答

  • 4

    有一个未解决的问题:https://youtrack.jetbrains.com/issue/KT-4113

    目前,它的目标版本是1.3 .

  • 1

    在这种情况下,smart casting似乎没有正常工作,我期望和你一样 . 它仅适用于 invoke()

    enter image description here

    我的 workaround 将使用 let 代替:

    test.foo?.let { foo ->
        foo(1.0, 2.0)
    }
    

相关问题