我在Java中有一个类A,在Kotlin中有一个接口B。
// kotlin
interface B {
fun optional()
}
// java
class A implements B {
}
我想在Kotlin接口(B)中编写默认方法(Java 8功能),并希望在A类中实现它。 我该如何实现?
谢谢。
我在Java中有一个类A,在Kotlin中有一个接口B。
// kotlin
interface B {
fun optional()
}
// java
class A implements B {
}
我想在Kotlin接口(B)中编写默认方法(Java 8功能),并希望在A类中实现它。 我该如何实现?
谢谢。
只要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-target 1.8
-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 {
}