如何在Java中访问Kotlin companion对象?
我将我的一个Java类转换为Kotlin,并将该类转换为如下所示如何在Java中访问Kotlin companion对象?,java,kotlin,Java,Kotlin,我将我的一个Java类转换为Kotlin,并将该类转换为如下所示 class MainApplication : Application() { companion object { operator fun get(context: Context): MainApplication { return context.applicationContext as MainApplication } } } 它有一个静态函数
class MainApplication : Application() {
companion object {
operator fun get(context: Context): MainApplication {
return context.applicationContext as MainApplication
}
}
}
它有一个静态函数get
我仍然有一个Java函数访问它
MainApplication application = MainApplication.get(mContext);
当main应用程序使用Java时,这很好。但不是当MainApplication在Kotlin中时,上面的代码错误
Error:(27, 54) error: cannot find symbol method get(Context)
如何在上面的Java代码中访问
get
。只需使用下面的选项
MainApplication application = MainApplication.Companion.get(mContext);
您可以在companion对象中向方法添加注释,以使Kotlin生成静态方法
class MainApplication : Application() {
companion object {
@JvmStatic fun get(context: Context): MainApplication {
return context.applicationContext as MainApplication
}
}
}
然后,您可以像在转换为Kotlin之前一样从Java访问它:
MainApplication application = MainApplication.get(mContext);
编辑:我觉得有必要添加一些我最近学到的东西:
@JvmStatic
实际上并不移动方法生成的位置。它通过为Java生成一个静态方法(除了伴生对象上的方法之外)来复制它。就我个人而言,我认为这并不好,它可能会根据用例产生一些影响,因此值得了解。通过省略伴星对象的名称,必须使用伴星对象的名称来访问这些方法
例如:
class MyClass1 {
companion object Object1 {
fun method1 {
}
}
}
class MyClass2 {
companion object {
fun method2 {
}
}
}
要调用第一个伴生对象方法,请执行以下操作:
MyClass1.method1()
要调用第二个命令:
MyClass2.Companion.method2()
有关详细信息,请参阅上的Kotlin文档。如果在方法调用中使用了
new
关键字,您可能会遇到无法访问Java中伴生对象的方法的问题。应省略new
关键字。各国:
伴生对象及其成员只能通过包含类名称访问,不能通过包含类的实例访问
所以,如果你有这样一门课:
class MyClass {
companion object {
fun create() {}
}
}
您可以这样调用伴生对象的方法:
MyClass.create()
但不是这样:
新建MyClass。创建一个漂亮的MyClass。看起来有两种方法。这取决于我们可以改变哪一方(kotlin或java)。勾选这个作为“答案”,因为人们更可能需要使kotlin与java兼容,而不是相反。(即人们可能会从Java转换到Kotlin,并使用Kotlin代码而不是Java代码)。另一个答案(我的答案)即使用MainApplication.Companion.get(mContext)
也是一个很好的答案:)根据官方文档:在这个场景中应该使用@JvmField
,而不是@JvmStatic
@JvmField用于属性,而不是函数。请参见,如果您不喜欢默认的companion
名称,也可以命名companion对象。从Kotlin 1.1.50开始,您可以通过省略companion
关键字来调用companion对象的函数,而不是从Java调用companion对象,并且它没有名称。我必须使用MyClass1.Object1.method1()
,但是这个效果最好,谢谢!