在Kotlin的Runnable SAM内无法获得回报?

Ped*_*roD 3 kotlin kotlin-interop

我对这段代码有以下错误,这对我没有意义:

fun spawnWorker(): Runnable {
    return Runnable {
        LOG.info("I am a potato!")
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

我的IDE对我说:

在此输入图像描述

但是Runnable接口说不然:

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}
Run Code Online (Sandbox Code Playgroud)

我之所以无法返回的原因是什么,但没有任何回报它编译得很好:

fun spawnWorker(): Runnable {
    return Runnable {
        LOG.info("I am a potato!")
    }
}
Run Code Online (Sandbox Code Playgroud)

Ing*_*gel 8

return从最近的封闭函数或匿名函数返回一个普通函数.在您的示例中,返回是非本地的,spawnWorker并且从RunnableSAM适配器返回,而不是从SAM适配器返回.要获得本地退货,请使用带标签的版本:

fun spawnWorker(): Runnable {
    return Runnable {
        LOG.info("I am a potato!")
        return@Runnable
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 并不是编译器无法检查范围,实际上它会检查范围并禁止从该范围返回非本地.return语句是故意设计的,用于从最近的非lambda函数返回,以启用带有lambdas的内联函数,例如`forEach`,`synchronized`等,看起来像语言结构.关于return语句的更多细节:https://kotlinlang.org/docs/reference/returns.html#return-at-labels (2认同)