如何使接口默认实现的函数支持@JvmStatic供Java静态调用?
如何让接口默认实现的方法通过companion object被Java静态调用?
直接让companion object实现带默认方法的接口时,Java无法通过Foo.bar()静态调用接口的默认方法——因为接口默认方法会被编译为Companion实例的方法,而非Java静态方法。但可以通过显式重写接口方法并添加@JvmStatic注解来实现需求。
解决方案示例
1. 定义带默认实现的接口
interface Bar { fun bar() { // 接口默认实现逻辑 println("默认的bar方法实现") } }
2. 在companion object中重写方法并添加@JvmStatic
class Foo { companion object : Bar { @JvmStatic override fun bar() { // 直接复用接口默认实现,也可以自定义逻辑 super.bar() } } }
3. Java中静态调用
// 正常编译运行 Foo.bar();
原理说明
@JvmStatic注解的作用是让Kotlin编译器为companion object的成员生成对应的Java静态方法。- 接口的默认方法本身不属于companion object的成员,因此必须显式重写该方法并标注
@JvmStatic,才能将其暴露为Java可调用的静态方法。 - 如果不重写,Java只能通过
Foo.Companion.bar()调用接口默认方法,无法直接静态调用。
内容的提问来源于stack exchange,提问作者Matthew Layton
相关产品推荐
相关产品推荐

