I convert one of my Java class to Kotlin and the class as below.
class MainApplication : Application() {
companion object {
operator fun get(cont
You can add @JvmStatic annotation to the method in companion object to make Kotlin generate a static method.
class MainApplication : Application() {
companion object {
@JvmStatic fun get(context: Context): MainApplication {
return context.applicationContext as MainApplication
}
}
}
you can then access it from Java like before converting to Kotlin:
MainApplication application = MainApplication.get(mContext);
EDIT: I feel obliged to add something I learned recently: @JvmStatic
doesn't actually move where the method gets generated. It duplicates it, by generating a static method for Java in addition to the method on the companion object. Personally I think this isn't great and it can have some implications depending on a use case, so something worth knowing.
By omitting the name of your companion object, the name Companion
must be used to access the methods.
Example:
class MyClass1 {
companion object Object1 {
fun method1 {
}
}
}
class MyClass2 {
companion object {
fun method2 {
}
}
}
To invoke the first companion object method you would do the following:
MyClass1.method1()
To invoke the second:
MyClass2.Companion.method2()
See the Kotlin docs on Companion Objects for details.
You may encounter a problem where you cannot access the Companion object's method in Java if the new
keyword is used in the method call. The new
keyword should be omitted. The documentation states:
Companion objects and their members can only be accessed via the containing class name, not via instances of the containing class.
So if you have a class like this:
class MyClass {
companion object {
fun create() {}
}
}
You can call the companion object's method like this:
MyClass.create()
But not like this:
new MyClass.create
Ops, I got it. Just use the below.
MainApplication application = MainApplication.Companion.get(mContext);