我们在Kotlin中,要某个函数做某件事时,会传一个函数参数给它。 而在Java中,并不支持传送函数参数。通常Java的实现方式是将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法。在大多数情况下,这些接口只有单个抽象方法(single abstract method),在Java中被称为SAM类型。
例如:Runnable接口:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
在 Java 8中我们也通常称之为函数式接口。
Kotlin 支持 SAM 转换。Kotlin 的函数字面值可以被自动的转换成只有一个非默认方法的 Java 接口的实现,只要这个方法的参数类型能够与这个 Kotlin 函数的参数类型相匹配。
我们可以这样创建 SAM 接口的实例:
val runnable = Runnable { println("执行测试") } // Kotlin 调用Java的SAM接口方法
测试代码:
@RunWith(JUnit4::class)
class SAMFunctionalInterfaceTest {
@Test fun testSAMFunctionalInterface() {
val runnable = Runnable { println("执行测试") }
val thread = Thread(runnable)
thread.start()
}
}
要注意的是,SAM 转换只适用于接口,而不适用于抽象类,即使这些抽象类也只有一个抽象方法。
还要注意,此功能只适用于 Java 互操作;因为 Kotlin 具有合适的函数类型,所以不需要将函数自动转换为 Kotlin 接口的实现。