为什么必须调用类成员函数types?

fun test() { class Test(val foo: ((Double, Double) -> Double)?) val test = Test(null) if(test.foo != null) test.foo(1.0, 2.0) } 

上面的代码生成错误:

Kotlin:引用有一个可为空的types’((Double,Double) – > DoubleArray)?’,使用显式的’?.invoke()’来代替函数式的调用。

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

types为’((Double,Double) – > DoubleArray’)的非空接收者进行不必要的安全调用

遵循这个建议,我结束了test.foo.invoke(1.0, 2.0) ,我认为它可以与test.foo(1.0, 2.0) )互换。 为什么这里不是这种情况?

当foo不是class级成员时,事情就像我期望的那样工作:

 fun test2() { val foo: ((Double, Double) -> Double)? = null if(foo != null) foo(1.0, 2.0) } 

2 Solutions collect form web for “为什么必须调用类成员函数types?”

这是一个开放的问题: https : //youtrack.jetbrains.com/issue/KT-4113

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

在这种情况下, 智能铸件似乎不能正常工作,我希望和你一样。 它只适用于invoke()

在这里输入图像说明

我的解决方法是使用let来代替:

 test.foo?.let { foo -> foo(1.0, 2.0) } 
  • 我似乎无法得到我的Kotlin回收多重查看代码整理出来
  • 使用kotlin在Spring Boot中自定义Jersey ExceptionMapper
  • 如何创建Kotlin Annotation嵌套类
  • 我怎样才能引用从Java的伴侣对象?
  • 在Kotlin中将地图的值加1
  • Kotlin错误:无法findorg.jetbrains.kotlin:kotlin-stdlib-jre7:1.0.7
  • Kotlin的名单缺少“添加”,“删除”等?
  • 有没有一个标准的Kotlin方法来使这个数据类的特殊对象有一个不同的toString()方法?
  • Kotlin和Java String之间的差异与正则expression式分割
  • Kotlin数组的toList和asList有何不同?
  • 如何实现一个视图的Kotlin函数
  • Kotlin language will be the best programming language for Android.