Код не компилируется: synchronized не является таким модификатором функции Kotlin, а reified требует inline. Здесь reified вообще не нужен, достаточно обычного generic.
Проверка компиляции и исправление ошибок в Kotlin‑программе
Код не компилируется: synchronized не является таким модификатором функции Kotlin, а reified требует inline. Здесь reified вообще не нужен, достаточно обычного generic.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо выяснить, компилируется ли представленный фрагмент кода на Kotlin, и в случае ошибок привести его к корректному виду.
class Task(var id: Long, val name: String)
val numbers = mutableListOf(1, 3, 5)
val taskSet = HashSet<Task>()
fun main() {
val firstTask = Task(1, "Задача")
val secondTask = Task(1, "Задача")
taskSet.add(firstTask)
taskSet.add(secondTask)
numbers.add(7)
numbers.forEvery { item ->
if (item == 3) {
return@forEvery
}
println("$item")
}
println("tasks contains ${taskSet.size} elements")
println("Done!")
}
synchronized fun <reified T> List<T>.forEvery(itemAction: (T) -> Unit) {
this.reversed().forEach { itemAction(it) }
}
Ответ
Код не компилируется: synchronized не является таким модификатором функции Kotlin, а reified требует inline. Здесь reified вообще не нужен, достаточно обычного generic.
Исправление без ненужной синхронизации:
fun <T> List<T>.forEvery(itemAction: (T) -> Unit) {
for (index in lastIndex downTo 0) itemAction(this[index])
}
Результат main: 7, 5, 1, затем tasks contains 2 elements и Done!. return@forEvery пропускает только обработку 3. Task — обычный класс без собственного equals/hashCode, поэтому два одинаково заполненных экземпляра остаются разными элементами HashSet. Если список совместно изменяется, нужна отдельная согласованная схема блокировки всех доступов.