Kotlin将类型函数作为函数扩展来实现 - 可以从Java调用吗?

Chu*_*ulo 5 java kotlin kotlin-android-extensions kotlin-reified-type-parameters

我正在尝试使用具有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
}
Run Code Online (Sandbox Code Playgroud)

Kotlin字节码:

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

客户代码:

Kotlin文件

override fun showMessageEmptyOfferFeeds() {
        mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED
}
Run Code Online (Sandbox Code Playgroud)

Java文件

showProfileDetailsUi(){
   startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED
}
Run Code Online (Sandbox Code Playgroud)

s1m*_*nw1 5

是的,您可以使用inline带有reified类型的函数作为扩展函数.这样做是private为了让Java代码无法访问它(顺便说一句,这不是"普通" inline函数的情况).这样的inline函数可以是private科特林因为内联函数复制的地方,其中它们被调用.

一个例子:

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

//usage

startActivity<DetailActivity>()
Run Code Online (Sandbox Code Playgroud)

reified在另一个SO问题中阅读更多信息,我回答:https://stackoverflow.com/a/45952201/8073652

再一次:您不能使用从Java键入的inline函数reified.