[英]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.