在 Kotlin 的 Runnable SAM 中不能有 return 吗?

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

这段代码出现以下错误,这对我来说毫无意义:

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

我的 IDE 对我说:

但 Runnable 接口另有说明:

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

为什么我不能在那里有一个 return,但是没有任何 return 它编译得很好:

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

来自最近的封闭函数或匿名函数的普通 return returns。在您的示例中,return 是非本地的,return 来自 spawnWorker 而不是来自 Runnable SAM 适配器。对于本地 return,使用标记版本:

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

您正在使用 lambda 到 SAM 的转换,因此尝试从 lambda 语句 return,不允许单独使用 return。

您的代码

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

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

将其与 returning 对象进行比较,后者是 Java 的直接翻译:

fun spawnWorker(): Runnable {
    return object : Runnable {
        override fun run() {
            LOG.info("I am a potato!")
            return // don't really need that one
        }
    }
}