При предоставлении лямбды для Runnable, почему мне не нужно переопределять метод запуска? - PullRequest
1 голос
/ 24 апреля 2020

введите описание изображения здесь

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

1 Ответ

0 голосов
/ 24 апреля 2020

Kotlin имеет функцию, называемую SAM (метод Single Abstract) , которая позволяет вам указать lambda, где ожидается интерфейс SAM, а язык позаботится о создании реализация для вас. Это имеет смысл, потому что в этих интерфейсах есть только один method (ie. Runnable), поэтому вы должны написать весь стандартный код, а не просто обеспечить реализацию SAM как lambda.

Так что в вашем примере, даже если вы не override run method, код, который вы предоставляете как lambda, на самом деле является реализацией run метода. И в полной форме это будет выглядеть так:

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