Я конвертирую один из моих классов 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-коде выше?
Вы можете добавить примечание @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 в дополнение к методу сопутствующего объекта. Лично я думаю, что это не здорово, и это может иметь некоторые последствия в зависимости от варианта использования, поэтому что-то стоит знать.
Опс, я понял. Просто используйте ниже.
MainApplication application = MainApplication.Companion.get(mContext);
Опуская имя вашего сопутствующего объекта, для доступа к методам необходимо использовать имя Companion
.
Пример:
class MyClass1 { companion object Object1 { fun method1 { } } } class MyClass2 { companion object { fun method2 { } } }
Чтобы вызвать первый метод сопутствующих объектов, вы должны сделать следующее:
MyClass1.method1()
Чтобы вызвать второе:
MyClass2.Companion.method2()
Подробные сведения см. В документах Kotlin на объектах Companion .