Не может быть возврата внутри Runnable SAM в Котлин?

У меня есть следующая ошибка с этим фрагментом кода, который для меня не имеет смысла:

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 } } }