1

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

例如,在创建处理线程应该做什么的自定义类时,我有 2 个选项:

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

    override fun run() {}
}

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

    override fun invoke() {}
}

我要求:

  1. 各有优劣(因为我相信实现了Runnable并扩展了“() -> Unit”)
  2. 在这种情况下,这是首选的使用方式
4

1 回答 1

2

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

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

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

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

并回答您的具体观点:

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

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

于 2020-10-10T13:18:56.383 回答