В лямбда-выражении с типом, отличным от Unit
, последний оператор должен быть выражением. while
не является выражением, и поэтому Котлин делает вывод, что кодовый блок
while(true){
return@Callable "hello"
}
предназначен для возврата Unit
. Компилятор не делает более глубокий анализ, чтобы сделать вывод, что это бесконечный цикл с нелокальным оператором возврата.
Таким образом, вы должны убедиться, что последняя строка вашей лямбды является выражением типа String
.
Однажды я создал вспомогательную функцию для сценариев, где ожидается определенный тип , но не значение:
fun <T> declval(): T = throw IllegalStateException("Code should be unreachable")
Он моделируется после C ++ std :: declval () . Итак, ваша лямбда может быть:
val a:() -> String = a@ {
while(true){
return@a "hello"
}
declval<String>()
}
Но это может быть легче понять, если вы просто измените поток управления вашего бесконечного цикла, чтобы получить одну точку выхода (например, с помощью break
).