У меня есть следующая ошибка с этим фрагментом кода, который для меня не имеет смысла:
fun spawnWorker(): Runnable { return Runnable { LOG.info("I am a potato!") return } }
Моя IDE говорит это мне:
Но интерфейс Runnable говорит иначе:
@FunctionalInterface public interface Runnable { public abstract void run(); }
В чем причина того, что я не могу туда вернуться, но без каких-либо возвратов он компилируется нормально:
fun spawnWorker(): Runnable { return Runnable { LOG.info("I am a potato!") } }
Простой return
возвращается из ближайшей закрывающей функции или анонимной функции. В вашем примере возврат не является локальным и возвращается из spawnWorker
а не из адаптера Runnable
SAM. Для локального возврата используйте обозначенную версию:
fun spawnWorker(): Runnable { return Runnable { LOG.info("I am a potato!") return@Runnable } }
Вы используете преобразование лямбда-к-SAM, тем самым пытаясь вернуться из заявления лямбда, которому не разрешено иметь возврат самостоятельно.
Ваш код
fun spawnWorker(): Runnable { return Runnable { LOG.info("I am a potato!") } }
Означает то же, что
fun spawnWorker(): Runnable { return { LOG.info("I am a potato!") } }
Сравните это с возвратом объекта, который является прямым переводом с Java:
fun spawnWorker(): Runnable { return object : Runnable { override fun run() { LOG.info("I am a potato!") return // don't really need that one } } }