Почему вызовы должны быть вызваны с помощью вызова класса класса?

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) } 

Для этого есть открытая проблема: https://youtrack.jetbrains.com/issue/KT-4113

В настоящее время это целевая версия 1.3.

Разумеется, умное кастинг работает неправильно в этой ситуации, я бы ожидал того же, что и вы. Он работает только с invoke() :

введите описание изображения здесь

Мое обходное решение будет использовать вместо этого:

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