繁体   English   中英

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

[英]Kotlin reified type function as function extension - Callable from 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字节码:

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
}

是的,您可以使用带有reified类型的inline函数作为扩展函数。 它是private因此Java代码无法访问它(顺便说一下,这不是“普通” inline函数的情况)。 这样的inline函数可以是private ,因为内联函数被复制 他们调用的地方科特林

一个例子

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

//usage

startActivity<DetailActivity>()

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

再次: 你不能使用inline函数用reified从Java类型。

编译后的inline reified reified函数'disppear',因为JVM上不存在reified类型。 这是编译器的一个技巧。

私有函数存在的唯一原因可能是,如果有人在运行时尝试覆盖它,则会导致错误,因为已知内联函数是完全内联的,无法覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM