我在java中有一个类A,在Kotlin中有一个接口B。
// kotlin
interface B {
fun optional()
}// java
class A implements B {
}我想在Kotlin接口(B)中编写默认方法(Java 8特性),并想在类A中实现它,我该如何实现它?
提前谢谢。
发布于 2019-11-07 09:50:43
在Kotlin中,带有by的接口方法默认编译如下:
// 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
-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 {
}发布于 2019-11-06 19:47:25
只要除了A之外还有实现B的其他类,这可能是有意义的。否则,您要么不需要默认实现,要么不必在实现类中实现该方法。
但是,您可以这样做:
interface B {
fun optional() { print("optional") }
}
class A implements B {
override fun optional() { print("B's optional") }
}https://stackoverflow.com/questions/58729265
复制相似问题