我正在尝试使用具有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
}
答案 0 :(得分:5)
是的,您可以使用inline
类型的reified
函数作为扩展函数。它是private
,因此 Java 代码无法访问它(顺便说一句,这不是“普通”inline
函数的情况)。
对于 Kotlin ,此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
函数从Java中键入reified
。
答案 1 :(得分:2)
inline reified
个函数'disppear',因为JVM上不存在已知类型。这是编译器的一个技巧。
私有函数存在的唯一原因可能是,如果有人在运行时尝试覆盖它,则会导致错误,因为已知内联函数是完全内联的,无法覆盖。