Я думаю, что здесь есть две проблемы с использованием интерфейса Function
.
Первая проблема в том, что это не означает, что вы думаете. Насколько я понимаю, это очень общий интерфейс, реализованный всеми функциями, однако многие параметры они принимают (или не принимают). Так что у него нет метода invoke()
. Вот на что жалуется компилятор.
Function
имеет несколько подчиненных интерфейсов, по одному для каждой «арности» (т. Е. По одному для каждого числа параметров): Function0
для функций, которые не принимают параметров, Function1
для функций, принимающих один параметр, и т. Д. , Эти имеют соответствующие invoke()
методы. Таким образом, вы могли бы исправить это, заменив Function
на Function0
.
Но это подводит меня ко второй проблеме, которая заключается в том, что интерфейсы функций не должны использоваться таким образом. Я думаю, что они в основном для совместимости с Java и / или для внутреннего использования компилятором.
Обычно гораздо лучше использовать синтаксис Kotlin для типов функций: (P1, P2...) -> R
. Это намного проще для чтения и позволяет избежать подобных проблем.
Таким образом, реальный ответ, вероятно, заключается в замене Function<Unit>
на () -> Unit
.
Также, если неясно, у Kotlin нет типа void
. Вместо этого он имеет тип Unit
, который имеет ровно одно значение. Это может показаться странным, но имеет смысл в системе типов, поскольку позволяет компилятору отличать функции, которые возвращают без явного значения, от функций, которые не возвращают. (Последние могут всегда генерировать исключение или выходить из процесса. Их можно определить так, чтобы они возвращали Nothing
- тип без значений вообще.)