Функция типа Ketlin reified как расширение функции – Вызывается с Java?

Я пытаюсь использовать функцию с типом reified как функцию расширения, но я не думаю, что это возможно, потому что после того, как я проверил сгенерированный байт-код, я обнаружил, что подпись метода является частной, любая работа, чтобы сделать ее общедоступной?

CommonExtensions.kt

inline fun<reified T: Activity> Context.startActivity() { val intent = Intent(this, T:: class.java) startActivity(intent) } fun View.visible() { visibility = View.VISIBLE } 

Kotlin Bytecode:

 private final static startActivity(Landroid/content/Context;)V @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0 ... 

Код клиента:

Файл Kotlin

 override fun showMessageEmptyOfferFeeds() { mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED } 

Файл Java

 showProfileDetailsUi(){ startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED } 

    Да, вы можете использовать inline функции с типами reified качестве функций расширения. Он сделан private так что Java- код не может получить к нему доступ (кстати, это не относится к «нормальным» inline функциям). Такая inline функция может быть private для Kotlin, потому что встроенные функции копируются в место, где они вызывается .

    Пример:

     inline fun <reified T : Activity> Activity.startActivity() { startActivity(Intent(this, T::class.java)) } //usage startActivity<DetailActivity>() 

    Узнайте больше о reified в другом вопросе SO, я ответил: https://stackoverflow.com/a/45952201/8073652

    Еще раз: вы не можете использовать inline функции с reified введенными с Java.

    inline reified функции «disppear» после компиляции, потому что в JVM не существует типов reified. Это трюк компилятора.

    Вероятно, единственная причина, по которой частная функция состоит в том, чтобы вызвать ошибку, если кто-то пытается переопределить ее во время выполнения, поскольку функция reified полностью встроена и не может быть переопределена.