Elye
Elye

Reputation: 60081

How to access Kotlin companion object in Java?

I convert one of my Java class to Kotlin and the class as below.

class MainApplication : Application() {
    companion object {
        operator fun get(context: Context): MainApplication {
            return context.applicationContext as MainApplication
        }
    }
}

It has a static function get.

I still have a Java function accessing it.

MainApplication application = MainApplication.get(mContext);

It was good when MainApplication is in Java. But not when MainApplication in Kotlin, the above code error

Error:(27, 54) error: cannot find symbol method get(Context)

How could I access get in my Java code above?

Upvotes: 71

Views: 33252

Answers (4)

Dmitriy Pavlukhin
Dmitriy Pavlukhin

Reputation: 419

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

Upvotes: 0

Mike
Mike

Reputation: 11545

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.

Upvotes: 11

Marcin Koziński
Marcin Koziński

Reputation: 11044

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.

Upvotes: 98

Elye
Elye

Reputation: 60081

Ops, I got it. Just use the below.

MainApplication application = MainApplication.Companion.get(mContext);

Upvotes: 37

Related Questions