8

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

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!")
    }
}
4

2 回答 2

15

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

fun spawnWorker(): Runnable {
    return Runnable {
        LOG.info("I am a potato!")
        return@Runnable
    }
}
于 2016-12-20T16:15:08.643 回答
2

您正在使用 lambda 到 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
        }
    }
}
于 2016-12-21T06:24:44.860 回答