为什么Kotlin的companion object无法在Java代码中被访问?
Kotlin companion object 无法被Java直接访问的成因
Kotlin从设计层面没有原生支持静态类成员,companion object 是Kotlin提供的「类级别成员」语法糖,它的底层实现和Java原生静态成员完全不同,这是访问失败的核心原因:
- companion object 本质是所属Kotlin类内部的单例内部类实例,其内部定义的成员默认会被编译为该内部单例的实例成员,而非外部类的静态成员,Java不存在对这个语法糖的适配,自然无法直接通过
外部类.成员名的方式访问。 - 默认编译规则下,Java要访问companion object的成员,必须显式指定单例名:
示例Kotlin代码:
对应Java访问写法:class KotlinClass { companion object { val num = 100 fun printInfo() = println("test") } }// 正确默认写法 int getNum = KotlinClass.Companion.getNum(); KotlinClass.Companion.printInfo(); // 直接这么写会报错,找不到对应静态成员 // int wrongGet = KotlinClass.num; // KotlinClass.printInfo(); - 如果希望Java可以像调用静态成员一样直接访问companion内的成员,可以给对应成员添加
@JvmStatic注解,Kotlin编译器会额外生成对应外部类的静态成员桥接方法,即可直接访问。
内容的提问来源于stack exchange,提问作者Saurabh Dhage
相关产品推荐
相关产品推荐

