首页 > 解决方案 > 如何在 Kotlin 编写的接口中使用 Java 8 的默认方法特性

问题描述

我在 java 中有一个类 A,在 Kotlin 中有一个接口 B。

// kotlin
interface B {
    fun optional()
}
// java
class A implements B {
}

我想在 Kotlin 接口 (B) 中编写默认方法(Java 8 特性),并希望在 A 类中实现它。我该如何实现呢?

提前致谢。

标签: javakotlinjava-8interfacedefault-method

解决方案


在 Kotlin 中,带有主体的接口方法默认编译如下:

// kotlin
interface B {
    fun optional() { println("B optional body") }
}

大致编译为:

public interface B {
   void optional();
   public static final class DefaultImpls {
      public static void optional(B $this) {
         System.out.println("B optional body");
      }
   }
}

然后,在实现此接口的 Kotlin 类中,编译器会自动为方法添加一个覆盖optional并在那里调用B.DefaultImpls.optional(this)

public final class KA implements B {
   public void optional() {
      B.DefaultImpls.optional(this);
   }
}

但是,如果您想在 Java 中实现此接口并避免重写方法和手动optional调用呢?B.DefaultImpls在这种情况下,您可以使用实验@JvmDefault功能

首先,您需要启用几个编译器选项:

  • JVM 目标字节码版本 1.8 或更高版本:-jvm-target 1.8
  • 启用 JVM 默认方法:(-Xjvm-default=enable通过上面的链接查看其他可用的选项值)

然后,你optional用注解来注解方法@JvmDefault

// kotlin
interface B {
    @JvmDefault
    fun optional() { println("B optional body") }
}

它被编译成

public interface B {
   @JvmDefault
   default void optional() {
      System.out.println("B optional body");
   }
}

现在这个接口的 Java 实现就变成了:

public final class A implements B {
}

推荐阅读