在 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
}
}
}
这段代码出现以下错误,这对我来说毫无意义:
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
}
}
}