SAM转换

和Java8类似,Kotlin支持SAM(Single Abstract Method)转换。这意味着Kotlin函数文本可以被自动的转换为Java接口的实现,只要接口方法的参数类型匹配了Kotlin函数的参数类型。

你可以使用下面的方式创建SAM接口的实例:

val runnable = Runnable { println("This runs in a runnable") }

在方法中调用:

val executor = ThreadPoolExecutor()
// Java signature: void execute(Runnable command)
executor.execute { println("This runs in a thread pool") }

如果Java类有多个方法功能性接口(这里我的理解有点像空方法),你可以使用一个适配器函数来选择调用你需要的一个,将一个lambda表达式转化为一个特定的SAM类型。这样的适配器函数也是编译器在需要的时候才会生成。

executor.execute(Runnable { println("This runs in a thread pool") })

需要注意的是SAM转换只是对接口有效,而不是抽象类,甚至是那些只有一个抽象方法的抽象类也不适用。

同时也需要注意的是,这个特性仅仅是在与Java的互操作性才有效;因为Kotlin有适当的函数类型,自动的将函数转换为Kotlin接口的实现是没必要的,因此不支持这个特性。

results matching ""

    No results matching ""