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)
}
答案 0 :(得分:4)
这是一个未解决的问题:https://youtrack.jetbrains.com/issue/KT-4113
目前,它的目标版本是1.3。
答案 1 :(得分:1)
smart casting似乎在这种情况下无法正常工作,我期望和你一样。它仅适用于invoke()
:
我的解决方法将改为使用let
:
test.foo?.let { foo ->
foo(1.0, 2.0)
}