在Kotlin的Runnable SAM内无法返回?

时间:2016-12-20 16:10:53

标签: kotlin kotlin-interop

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

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

我的IDE对我说:

enter image description here

但是Runnable接口说不然:

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

为什么我不能在那里获得回报的原因是什么,但没有任何回报它编译得很好:

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

您正在使用lambda-to-SAM转换,因此尝试从lambda语句返回,该语句不允许自己返回。

您的代码

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