Подтвердить что ты не робот

Как получить доступ к сопутствующему объекту 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-коде выше?

4b9b3361

Ответ 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 Сопутствующие объекты.