为什么必须通过调用调用类成员函数类型?

时间:2018-01-08 19:51:52

标签: kotlin

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'类型的非空接收器进行不必要的安全调用

根据这个建议,我最终得到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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

enter image description here

我的解决方法将改为使用let

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