首页 > 解决方案 > 在为 Runnable 提供 lambda 时,为什么我不必重写 run 方法?

问题描述

在此处输入图像描述

val obj = Runnable {
        for (i in 1..3)
        {
            println("$i")
            Thread.sleep(500)
        }
    }
    val r1 = Thread(obj)
    r1.start()

标签: multithreadingkotlinlambdaoverriding

解决方案


Kotlin 有一个称为SAM(Single Abstract method) Conversion的功能,它允许您指定接口的预期lambda位置SAM,并且该语言会为您创建实现。这是有道理的,因为method这些接口中只有一个(即 Runnable),所以为什么你应该编写所有样板代码,为什么不只SAM提供lambda.

所以在你的例子中,即使你没有overriderun method你提供的代码lambda实际上是run方法的实现。在其完整的形式中,它看起来像这样

val obj = object: Runnable{
    override fun run() {
        for (i in 1..3)
        {
            println("$i")
            Thread.sleep(500)
        }
    }
}

推荐阅读