web-dev-qa-db-fra.com

Comment accéder à l'objet compagnon Kotlin en Java?

Je convertis une de mes classes Java en Kotlin et la classe ci-dessous.

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

Il a une fonction statique get.

J'ai toujours une fonction Java qui y accède.

MainApplication application = MainApplication.get(mContext);

C'était bien quand MainApplication est en Java. Mais pas lorsque MainApplication dans Kotlin, l’erreur de code ci-dessus

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

Comment accéder à get dans le code Java ci-dessus?

23
Elye

Vous pouvez ajouter @JvmStatic annotation à la méthode dans l'objet compagnon pour que Kotlin génère une méthode statique.

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

vous pouvez alors y accéder depuis Java comme avant de convertir en Kotlin:

MainApplication application = MainApplication.get(mContext);

EDIT: Je me sens obligé d'ajouter quelque chose que j'ai appris récemment: @JvmStatic n'est pas réellement move où la méthode est générée. Il le duplique en générant une méthode statique pour Java en plus de la méthode sur l'objet compagnon. Personnellement, je pense que ce n'est pas génial et que cela peut avoir des implications en fonction du cas d'utilisation, donc quelque chose d'intéressant à connaître.

28
Marcin Koziński

Ops, je l'ai eu. Il suffit d'utiliser le ci-dessous.

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

En omettant le nom de votre objet compagnon, le nom Companion doit être utilisé pour accéder aux méthodes.

Exemple: 

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

class MyClass2 {
    companion object {
        fun method2 {
        }
    }
}

Pour appeler la première méthode d'objet compagnon, procédez comme suit: 

MyClass1.method1()

Pour invoquer le second: 

MyClass2.Companion.method2()

Voir la documentation Kotlin sur Objets compagnon pour plus de détails.

2
Mike