В чем разница между () -> единицей и (единицей) -> типами единиц?

У меня есть следующие функции:

fun <T, U> process(t: T, call: (U) -> Unit, map: (T) -> U) = call(map(t)) fun <T> processEmpty(t: T, call: () -> Unit) = process(t, call, {}) // error 

но processEmpty не компилируется. Сообщение об ошибке – Type mismatch: inferred type is () -> kotlin.Unit but (kotlin.Unit) -> kotlin.Unit was expected . Но если я изменю эту функцию на

 fun <T> processEmpty2(t: T, call: (Unit) -> Unit) = process(t, call, {}) // OK 

Итак, в чем разница между () -> Unit и (Unit) -> Unit типами (Unit) -> Unit ? Почему первая версия processEmpty не компилируется?

Unit фактически является типом, который имеет ровно одно значение (значение – это сам Unit , также, поэтому он называется Unit ). Это соответствует void на Java, но это не то же самое.

Компилятор Kotlin рассматривает функции без объявленного возвращаемого значения, поскольку функции Unit refurning и return Unit также могут быть опущены. Вот почему { } – функция, возвращающая единицы измерения.

Но это не относится к аргументам. Чтобы быть строгим, когда вы объявляете функцию с аргументом Unit или (Unit) -> Unit function variable, вам нужно передать аргумент типа Unit на сайте вызова. Единственное значение, которое необходимо пройти, – Unit .

Лямбда без определенных аргументов, таких как { doSomething() } , рассматривается как функция без аргументов и как функция с единственным неявным аргументом. Вы можете использовать { } как в качестве () -> Unit и (Unit) -> Unit .

Что касается сайта вызова, как сказано выше, необходимо передать Unit :

 val f: (Unit) -> Unit = { println("Hello") } f(Unit) // the only valid call 

В то время как функции () -> Unit не нуждаются в аргументе, который необходимо передать:

 val f: () -> Unit = { println("Hello") } f() // valid call 

В вашем примере введите вывод следующим образом:

 fun <T, U> process(t: T, call: (U) -> Unit, map: (T) -> U) = call(map(t)) fun <T> processEmpty(t: T, call: () -> Unit) = process(t, call, {}) // error 
  1. map: (T) -> U = { } , поэтому замена для U является Unit возвращаемой из { } .
  2. Поэтому call должен быть (Unit) -> Unit .
  3. call: () -> Unit который не совпадает с (Unit) -> Unit , как указано выше. Ошибка.
Intereting Posts
UnsatisfiedDependencyException для приложения Spring Boot 2.0.0.M2 с использованием Kotlin Kotlin: Инициализировать атрибут класса в конструкторе Android Studio не применяет мои изменения в дизайне Преобразование функции Scala в функцию Котлина Android – Kotlin – остановка в середине процесса Как установить конфигурации package.json с помощью kotlin-frontend-plugin Ошибка библиотеки библиотеки Android: не удается найти установщик для поля. (Котлин) Чтение JSON POST с использованием PHP kodein, ввод данных в простой класс Массив вложенных пар в котлин Передача собственности другому имуществу Если isConnected возвращает true, почему Exeption говорит, что он не подключен? Как вызвать функцию верхнего уровня из метода или функции расширения одной и той же сигнатуры? Функциональный маршрут Spring Web Flux (реактивный) не работает должным образом с Kotlin Kotlin – Возможно ли инициализировать объект-компаньон перед блоком init в классе?