Возьмем это как вводный пример:
def fun() { println("fun1 executed.") }
val a1 = fun
val a2: () => Unit = fun
Обе строки компилируются и (благодаря выводу типа) они выглядят эквивалентно.Однако a1
имеет тип Unit
, в то время как a2
имеет тип () => Unit
... Как это возможно?
Поскольку вы явно не предоставляете тип a1
, компиляторы интерпретируют fun
как метод fun
вызов типа Unit
, следовательно, тип a1
совпадает с типом fun
.Это также означает, что в этой строке будет напечатано fun1 выполнено.
Однако a2
явно объявил тип () => Unit
.Здесь вам поможет компилятор, и он понимает, что поскольку для контекста требуется функция типа () => Unit
, а вы предоставили метод, соответствующий этому типу, он не должен вызывать этот метод, а обрабатывать его как функцию первого класса!
Вы не обречены явно указывать тип a1
.Говоря:
val a1 = fun _
Теперь вы понимаете, где ваша проблема?