Используйте для него обобщенный тип c:
fun <T: Foo> initFoo(init: T.() -> Unit) = Unit
Обратите внимание, это ограничивает то, что вы можете делать с ним внутри функции. Так как вы принимаете функцию, которая может быть вызвана для определенного типа c, вы не можете вызвать переданную лямбду для любого Foo.
fun <T: Foo> initFoo(init: T.() -> Unit) {
val someFoo = object: Foo {}
someFoo.init() // ERROR (type mismatch)
}
Это потому, что, например, ваш Bar.() -> Unit
функция может использовать свойства и функции Bar
, которые не обязательно являются частью любого произвольного Foo
.