3.2.5 Kotlin支持SAM转换

Kotlin的Lambda函数体可以被转换为一个只有单个方法的Java接口实现,只要这个方法的参数类型能够跟这个Kotlin函数的参数类型匹配上,转换就能成功。

Scala也支持SAM转换。例如可以按照如下方式创建SAM接口的实例:

于是之前的代码:

         Thread { println("test") }.start()

也可以改成这样:

Kotlin支持SAM转换,提高了Kotlin调用Java的便利性。在Kotlin 1.4之前,SAM转换有以下特点:

(1)SAM转换只适用于Kotlin对Java的调用,因为Kotlin本身有合适的函数类型。

(2)SAM转换只适用于接口,不适用于抽象类,而且必须是Java接口。

在Kotlin 1.4之后,增加了支持Kotlin接口和函数的SAM转换,这得益于Kotlin新的类型推导算法。另外,在Kotlin 1.5之后使用invokedynamic来支持SAM转换。

Kotlin的接口需要使用fun关键字声明才能支持SAM转换。使用fun关键字声明的接口,如果将此类接口作为参数,就可以将Lambda作为参数传递。