SAM 转换

我们在Kotlin中,要某个函数做某件事时,会传一个函数参数给它。 而在Java中,并不支持传送函数参数。通常Java的实现方式是将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法。在大多数情况下,这些接口只有单个抽象方法(single abstract method),在Java中被称为SAM类型。

例如:Runnable接口:

  1. @FunctionalInterface
  2. public interface Runnable {
  3. public abstract void run();
  4. }

在 Java 8中我们也通常称之为函数式接口。

Kotlin 支持 SAM 转换。Kotlin 的函数字面值可以被自动的转换成只有一个非默认方法的 Java 接口的实现,只要这个方法的参数类型能够与这个 Kotlin 函数的参数类型相匹配。

我们可以这样创建 SAM 接口的实例:

  1. val runnable = Runnable { println("执行测试") } // Kotlin 调用Java的SAM接口方法

测试代码:

  1. @RunWith(JUnit4::class)
  2. class SAMFunctionalInterfaceTest {
  3. @Test fun testSAMFunctionalInterface() {
  4. val runnable = Runnable { println("执行测试") }
  5. val thread = Thread(runnable)
  6. thread.start()
  7. }
  8. }

要注意的是,SAM 转换只适用于接口,而不适用于抽象类,即使这些抽象类也只有一个抽象方法。

还要注意,此功能只适用于 Java 互操作;因为 Kotlin 具有合适的函数类型,所以不需要将函数自动转换为 Kotlin 接口的实现。