如何在Kotlin编写的界面中使用默认方法的Java 8功能

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

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

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

谢谢。

mayongxingqgzd 回答:如何在Kotlin编写的界面中使用默认方法的Java 8功能

只要A以外的其他类实现B,这可能是有道理的。否则,您不需要默认实现,也不必在实现类中实现该方法。

但是,您可以这样做:

interface B {
    fun optional() { print("optional") }
}

class A implements B {
    override fun optional() { print("B's optional") }
}
,

在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 @JvmDefault feature

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

  • 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 {
}
本文链接:https://www.f2er.com/3152589.html

大家都在问