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接口的实现是没必要的,因此不支持这个特性。