Kotlin作为函数扩展的函数类型函数 - 可从Java调用?
问题描述:
我想用具体化类型作为扩展函数的功能,但我不认为这是可能的,因为在我检查生成的字节码后,我发现方法签名是私人的,任何解决方法使它公开?Kotlin作为函数扩展的函数类型函数 - 可从Java调用?
CommonExtensions.kt
inline fun<reified T: Activity> Context.startActivity() {
val intent = Intent(this, T:: class.java)
startActivity(intent)
}
fun View.visible() {
visibility = View.VISIBLE
}
科特林字节码:
private final static startActivity(Landroid/content/Context;)V
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
...
客户端代码:
科特林文件
override fun showMessageEmptyOfferFeeds() {
mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED
}
的Java文件
showProfileDetailsUi(){
startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED
}
答
是的,你可以使用inline
功能reified
类型作为扩展功能。这是private
,以便Java代码不能访问它(顺便说一句,“正常”inline
功能不是这种情况)。 这种inline
函数可以是private
为科特林因为内联函数复制的地方其中它们调用。
的example:
inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
//usage
startActivity<DetailActivity>()
了解更多关于reified
在另一个SO问题,我回答:https://stackoverflow.com/a/45952201/8073652
再次:不能使用inline
功能与reified
从Java类型。
答
inline reified
功能 'disppear' 编译后,因为具体化的类型不JVM上的存在。这是编译器的一个窍门。
也许唯一的原因是私有函数在那里有一个错误,如果有人试图在运行时覆盖它,因为reified函数是完全内联的并且不能被覆盖。
+2
嗨,它并没有消失。它只是使隐藏的可见性,以避免Java代码调用它。 –
是的,它只是一个类的级别..但我不能用它在其中定义的文件的一面..我的问题是如何使用它作为正常的扩展功能? – Abdellah
尝试将其定义为最高级别。这是类似Extensions.kt的类,它可能只包含你的功能,没有围绕它的类 – s1m0nw1
我做了但不工作 – Abdellah