有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Kotlin编写的接口中使用默认方法的Java8特性

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

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

我想在Kotlin接口(B)中编写默认方法(Java8特性),并想在类A中实现它。 我怎样才能做到呢

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    只要A之外还有其他类实现B,这可能是有意义的。否则,您要么不需要默认实现,要么不必在实现类中实现该方法

    但是,您可以这样做:

    interface B {
        fun optional() { print("optional") }
    }
    
    class A implements B {
        override fun optional() { print("B's optional") }
    }
    
  2. # 2 楼答案

    在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,该怎么办?在这种情况下,可以使用the experimental ^{} feature

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

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

    然后,用@JvmDefault注释optional方法:

    // 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 {
    }