Как получить доступ к сопутствующему объекту Kotlin в Java?
Я конвертирую один из моих классов Java в Kotlin и класс, как показано ниже.
class MainApplication : Application() {
companion object {
operator fun get(context: Context): MainApplication {
return context.applicationContext as MainApplication
}
}
}
Он имеет статическую функцию get
.
У меня все еще есть функция Java, которая обращается к ней.
MainApplication application = MainApplication.get(mContext);
Это хорошо, когда MainApplication находится на Java. Но не тогда, когда MainApplication в Котлине, приведенная выше ошибка кода
Error:(27, 54) error: cannot find symbol method get(Context)
Как я могу получить доступ к get
в моем Java-коде выше?
Ответы
Ответ 1
Вы можете добавить @JvmStatic
аннотацию к методу в сопутствующем объекте, чтобы заставить Kotlin генерировать статический метод.
class MainApplication : Application() {
companion object {
@JvmStatic fun get(context: Context): MainApplication {
return context.applicationContext as MainApplication
}
}
}
вы можете получить к нему доступ с Java, как перед преобразованием в Kotlin:
MainApplication application = MainApplication.get(mContext);
EDIT: я чувствую себя обязанным добавить что-то, что я узнал недавно: @JvmStatic
фактически не переместить, где метод генерируется. Он дублирует, создавая статический метод для Java в дополнение к методу сопутствующего объекта. Лично я считаю, что это не очень удобно, и это может иметь некоторые последствия в зависимости от варианта использования, поэтому что-то стоит знать.
Ответ 2
Опс, я понял. Просто используйте ниже.
MainApplication application = MainApplication.Companion.get(mContext);
Ответ 3
Опуская имя вашего сопутствующего объекта, для доступа к методам необходимо использовать имя Companion
.
Пример:
class MyClass1 {
companion object Object1 {
fun method1 {
}
}
}
class MyClass2 {
companion object {
fun method2 {
}
}
}
Чтобы вызвать первый метод сопутствующих объектов, вы должны сделать следующее:
MyClass1.method1()
Чтобы вызвать второе:
MyClass2.Companion.method2()
Подробнее см. в документах Kotlin Сопутствующие объекты.