Kotlin 将类型函数具体化为函数扩展 - 可从 Java 调用?

Kotlin reified type function as function extension - Callable from Java?

我正在尝试使用具有具体化类型的函数作为扩展函数,但我不认为这是可能的,因为在检查生成的字节码后我发现方法签名是私有的,任何解决方法它 public ?

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 字节码:

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 在编译后运行 'disppear',因为 JVM 上不存在具体化的类型。这是编译器的把戏。

私有函数存在的唯一原因可能是如果有人试图在运行时覆盖它会导致错误,因为具体化的函数是完全内联的并且不能被覆盖。

是的,您可以使用具有 reified 类型的 inline 函数作为扩展函数。它被设置为 private,因此 Java 代码无法访问它(顺便说一句,"normal" inline 函数不是这种情况) . 这样的 inline 函数对于 Kotlin 可以是 private 因为内联函数是 copied 的地方其中它们被调用

一个example:

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

//usage

startActivity<DetailActivity>()

在另一个 SO 问题中阅读更多关于 reified 的信息,我回答:

再一次:您不能将 inline 函数与从 Java 键入的 reified 一起使用。