Kotlin Runnable 与 () -> 单位

Pat*_* SK 4 jvm kotlin

这两者之间的主要区别是什么?

例如,在创建自定义类(处理线程应该执行的操作)时,我有两个选项:

class ThreadHandler : Runnable {
    private val thread = Thread(this)

    override fun run() {}
}
Run Code Online (Sandbox Code Playgroud)

class ThreadHandler : () -> Unit {
    private val thread = Thread(this)

    override fun invoke() {}
}
Run Code Online (Sandbox Code Playgroud)

我要求:

  1. 彼此的优缺点(因为我认为是Runnable的实现和“() -> Unit”的扩展)
  2. 在这种情况下,哪种是首选使用方式

gid*_*dds 5

差异主要在于语言支持、互操作性、历史和用法。

\n

() -> Unit是 Kotlin 类型,表示不带参数且不返回任何有用内容的函数。\xc2\xa0 这些函数类型是 Kotlin 的基础,并且在整个标准库中使用,因此您可以将其传递给无数扩展函数。\xc2\ xa0 语言语法也支持它们;例如,您可以简单地附加()来运行它。

\n

Runnable是一个 Java 接口,定义一个不带参数且不返回任何有用信息的方法。\xc2\xa0 Java 没有一流的函数;相反,它使用接口获得了一些好处。 \xc2\xa0 (从 Java 8 开始,这些被形式化为 \xe2\x80\x98 功能接口 \xe2\x80\x99 ,并且可以由 lambda 实现,其中上下文提供了足够的信息;但Runnable它本身可以追溯到 Java 1.0。)\xc2\xa0 对它们的语言支持较少,因此您必须附加.run()才能运行它。\xc2\xa0 另外,尽管它们是通用的,但经常使用 Runnable为线程提供要执行的代码,因此与该执行模型相关联。

\n

因此,虽然这两个结构的含义大致相同,但前者看起来更自然,并且与大量 Kotlin 代码的互操作性更好,而后者与较旧的 Java 代码的互操作性更好,并且倾向于用于线程。

\n

并回答您的具体观点:

\n
    \n
  1. 是的,作为一种类型,我认为() -> Unit在技术上是扩展而不是实现,但这里的区别并不显着。

    \n
  2. \n
  3. 除非您特别需要主要与较旧的 Java 代码进行互操作,否则我建议使用 Kotlin 函数类型。

    \n
  4. \n
\n