блока init, то это ошибка компиляции. Но если обратиться к этому свойству в лямбде, то компилятор молчит, а на рантайме будет null.
class SomeClass1
fun SomeClass2.foo(init: () -> Unit): Unit = init()
class SomeClass2 {
init {
foo {
println(value)
}
//println(value)
}
val value = SomeClass1()
}
fun main() {
SomeClass2()
}
Это ок? Почему на этапе компиляции об этом не предупреждает?
Это стрёмная промежуточная ситуация. С одной стороны, если переданная лямбда будет вызываться потом, то всё ок. С другой стороны, если она инлайновая и/или вызывается in-place (контракты), то это вроде как баг.
это известные грабли. В трекере есть баги на эту тему, но без поломки обратной совместимости не лечится. Всегда пишите init первым блоком
Просто компилятор не знает, когда эта лямбда будет вызвана в общем случае, вот и разрешает
Обсуждают сегодня