Kotlin Runnable 与 () -> Unit
Kotlin Runnable vs () -> Unit
这两者之间的主要区别是什么?
例如,在创建自定义 class 时,它处理线程应该做什么,我有 2 个选项:
class ThreadHandler : Runnable {
private val thread = Thread(this)
override fun run() {}
}
和
class ThreadHandler : () -> Unit {
private val thread = Thread(this)
override fun invoke() {}
}
我要的是:
- 各有利弊(因为我相信Runnable的实现和"() -> Unit"的扩展)
- 在这种情况下,哪种是首选使用方式
差异主要在于语言支持、互操作性、历史和用法。
() -> Unit
是一种 Kotlin 类型,表示一个不带参数且不返回任何有用信息的函数。这些函数类型是 Kotlin 的基础,并在整个标准库中使用,因此您可以将其传递给无数扩展函数。语言语法也支持它们;例如,您可以简单地将 ()
附加到 运行 它。
Runnable
是一个 Java 接口,定义了一个不带参数且 returns 没有任何用处的方法。 Java 没有 first-class 功能;相反,它使用接口获得了一些好处。 (从 Java 8 开始,这些被形式化为“功能接口”,并且可以在上下文提供足够信息的情况下由 lambda 实现;但是 Runnable
本身可以追溯到 Java 1.0。)有对它们的语言支持较少,因此您必须将 .run()
附加到 运行 它。此外,虽然它们是 general-purpose,但 Runnable 通常用于为线程提供代码以执行,因此与该执行模型相关联。
因此,虽然这两个结构的意思大致相同,但前者看起来更自然并且与许多 Kotlin 代码的互操作性更好,而后者与旧的 Java 代码的互操作性更好并且倾向于用于线程。
并回答您的具体要点:
是的,作为一种类型,我认为() -> Unit
在技术上是扩展的而不是实现的,但这里的区别并不显着。
除非您特别需要主要与较旧的 Java 代码进行互操作,否则我建议使用 Kotlin 函数类型。
这两者之间的主要区别是什么?
例如,在创建自定义 class 时,它处理线程应该做什么,我有 2 个选项:
class ThreadHandler : Runnable {
private val thread = Thread(this)
override fun run() {}
}
和
class ThreadHandler : () -> Unit {
private val thread = Thread(this)
override fun invoke() {}
}
我要的是:
- 各有利弊(因为我相信Runnable的实现和"() -> Unit"的扩展)
- 在这种情况下,哪种是首选使用方式
差异主要在于语言支持、互操作性、历史和用法。
() -> Unit
是一种 Kotlin 类型,表示一个不带参数且不返回任何有用信息的函数。这些函数类型是 Kotlin 的基础,并在整个标准库中使用,因此您可以将其传递给无数扩展函数。语言语法也支持它们;例如,您可以简单地将 ()
附加到 运行 它。
Runnable
是一个 Java 接口,定义了一个不带参数且 returns 没有任何用处的方法。 Java 没有 first-class 功能;相反,它使用接口获得了一些好处。 (从 Java 8 开始,这些被形式化为“功能接口”,并且可以在上下文提供足够信息的情况下由 lambda 实现;但是 Runnable
本身可以追溯到 Java 1.0。)有对它们的语言支持较少,因此您必须将 .run()
附加到 运行 它。此外,虽然它们是 general-purpose,但 Runnable 通常用于为线程提供代码以执行,因此与该执行模型相关联。
因此,虽然这两个结构的意思大致相同,但前者看起来更自然并且与许多 Kotlin 代码的互操作性更好,而后者与旧的 Java 代码的互操作性更好并且倾向于用于线程。
并回答您的具体要点:
是的,作为一种类型,我认为
() -> Unit
在技术上是扩展的而不是实现的,但这里的区别并不显着。除非您特别需要主要与较旧的 Java 代码进行互操作,否则我建议使用 Kotlin 函数类型。