Ответ
Unit в Kotlin — это аналог void в Java, но представлен как объект. У него ровно один экземпляр — Unit.INSTANCE.
val unit1 = Unit
val unit2 = Unit
println(unit1 === unit2) // true (один и тот же объект)
Все функции, возвращающие Unit, фактически возвращают этот единственный экземпляр. Это синглтон, оптимизированный под капотом.
Ответ 18+ 🔞
А, ну это же про тот самый Unit, который все так любят сравнивать с void! Слушай, история-то вообще смешная. Вот в Java был void — ну, типа, функция ничего не возвращает, и точка. Пришли ребята из Kotlin, посмотрели на это и говорят: «Ёпта, да это же нелогично! Как это «ничего»? Всё должно быть объектом, всё должно иметь тип!». И придумали они Unit.
И этот Unit — он не просто тип. Это, блядь, самый настоящий синглтон, объект в единственном экземпляре. Представь себе: есть где-то в недрах рантайма такая одна-единственная константа, Unit.INSTANCE. И каждая функция, которая у тебя якобы «ничего не возвращает», на самом деле тихонечко подсовывает тебе в карман вот эту самую фигню. Она как сувенир «я тут был» из каждого вызова.
Вот смотри на код, тут всё наглядно:
val unit1 = Unit
val unit2 = Unit
println(unit1 === unit2) // true (один и тот же объект)
Видишь? unit1 и unit2 — это не просто два одинаковых значения. Это, ёпта, один и тот же объект в памяти! Сравнение === это подтверждает. Это как если бы ты в баре заказал «ничего», а тебе каждый раз приносили одну и ту же пустую кружку с дыркой на дне — на память. И все довольны: система типов не ломается, потому что тип есть, а компилятор под капотом оптимизирует эту хуйню так, что никаких накладных расходов нет.
По сути, это гениальная уловка. С одной стороны, ты пишешь код как будто на языке высшего уровня, а с другой — под капотом всё прибито гвоздями к перфомансу. Unit — это не void, это объект-пустышка, хуй с горы, который весит ровно ноль грамм, но формально существует. И доверия к этой схеме — ебать ноль, но она работает, и работает чертовски хорошо. Сам от такого иногда охуеваю, честно говоря.