如何在Java中访问Kotlin伴侣对象?

Ely*_*lye 35 java kotlin

我将我的一个Java类转换为Kotlin和类,如下所示.

class MainApplication : Application() {
    companion object {
        operator fun get(context: Context): MainApplication {
            return context.applicationContext as MainApplication
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它具有静态功能get.

我仍然有一个访问它的Java函数.

MainApplication application = MainApplication.get(mContext);
Run Code Online (Sandbox Code Playgroud)

当MainApplication在Java中时很好.但是当MainApplication在Kotlin中时,上面的代码错误

Error:(27, 54) error: cannot find symbol method get(Context)
Run Code Online (Sandbox Code Playgroud)

我怎样才能访问get上面的Java代码?

Mar*_*ski 44

您可以@JvmStatic在随附对象的方法中添加注释,以使Kotlin生成静态方法.

class MainApplication : Application() {
    companion object {
        @JvmStatic fun get(context: Context): MainApplication {
            return context.applicationContext as MainApplication
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在转换为Kotlin之前从Java访问它:

MainApplication application = MainApplication.get(mContext);
Run Code Online (Sandbox Code Playgroud)

编辑:我觉得有必要添加我最近学到的东西:@JvmStatic实际上并没有移动方法生成的地方.它复制它,通过在除了同伴对象上的方法生成的Java的静态方法.我个人认为这不是很好,它可能会有一些影响取决于用例,所以值得了解.

  • 另一个答案(我的),即使用MainApplication.Companion.get(mContext);也是一个很好的答案:) (2认同)

Ely*_*lye 19

Ops,我明白了.只需使用下面的内容.

MainApplication application = MainApplication.Companion.get(mContext);
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 9

通过省略伴随对象的名称,Companion必须使用该名称来访问方法。

例子:

class MyClass1 {
    companion object Object1 {
        fun method1 {
        }
    }
}

class MyClass2 {
    companion object {
        fun method2 {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要调用第一个伴随对象方法,您将执行以下操作:

MyClass1.method1()
Run Code Online (Sandbox Code Playgroud)

调用第二个:

MyClass2.Companion.method2()
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅关于伴随对象的 Kotlin 文档。

  • 如果您从 Java 调用伴随对象并且它没有名称,则不会。 (2认同)