java - 如何在 Kotlin 编写的接口中使用 Java 8 的默认方法特性
问题描述
我在 java 中有一个类 A,在 Kotlin 中有一个接口 B。
// kotlin
interface B {
fun optional()
}
// java
class A implements B {
}
我想在 Kotlin 接口 (B) 中编写默认方法(Java 8 特性),并希望在 A 类中实现它。我该如何实现呢?
提前致谢。
解决方案
在 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 {
}
推荐阅读
- javascript - 删除页面 URL 中的哈希并阻止页面滚动到锚哈希
- c# - 是否可以从另一个控制器返回视图并将其传递给局部视图
- excel - VBA函数将句子连接到第n个字符限制与分隔符
- python - 带有流的Python线程作为for循环?
- python - 谷歌合作问题
- android - 安卓工作室调试器:AndroidManifest.xml:11:AAPT:错误:意外元素
在发现 - chart.js - Chart.js 样式问题
- python - 在加拿大范围内抓取圆圈 K 位置时输入错误
- c++ - 如何在 C++ 中从 SQL 中检索日期字段
- matlab - 在 For 循环中定义变量