我对这段代码有以下错误,这对我没有意义:
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!")
}
}
答案 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
}
}
}