Search code examples
kotlinkotlin-interop

Can't have a return inside a Runnable SAM in Kotlin?


I am having the following error with this piece of code, which makes no sense to me:

fun spawnWorker(): Runnable {
    return Runnable {
        LOG.info("I am a potato!")
        return
    }
}

My IDE says this to me:

enter image description here

But the Runnable interface says otherwise:

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

What is the reason why I can't have a return there, but without any return it compiles fine:

fun spawnWorker(): Runnable {
    return Runnable {
        LOG.info("I am a potato!")
    }
}

Solution

  • A plain return returns from the nearest enclosing function or anonymous function. In your example, the return is non-local and returns from spawnWorker and not from the Runnable SAM adapter. For a local return, use the labeled version:

    fun spawnWorker(): Runnable {
        return Runnable {
            LOG.info("I am a potato!")
            return@Runnable
        }
    }