How to access Kotlin companion object in Java?

前端 未结 4 1523
谎友^
谎友^ 2021-01-07 15:58

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

class MainApplication : Application() {
    companion object {
        operator fun get(cont         


        
相关标签:
4条回答
  • 2021-01-07 16:29

    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.

    0 讨论(0)
  • 2021-01-07 16:32

    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.

    0 讨论(0)
  • 2021-01-07 16:39

    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

    0 讨论(0)
  • 2021-01-07 16:40

    Ops, I got it. Just use the below.

    MainApplication application = MainApplication.Companion.get(mContext);
    
    0 讨论(0)
提交回复
热议问题