Kotlin将函数扩展的types函数 – 从Java中调用?
我试图使用具体化types作为扩展function的函数,但我不认为这是可能的,因为我检查生成的字节码后,我发现方法签名是私人的,任何解决方法,使其公开?
CommonExtensions.kt
inline fun 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() //"startActivity()" extension func NOT RESOLVED }
是的,您可以使用inline
函数作为扩展函数。 它是private
所以Java代码不能访问它(顺便说一句,“正常” inline
函数并不是这种情况)。 这样的inline
函数可以是Kotlin private
,因为内联函数被复制到它们被调用的地方。
一个例子 :
inline fun Activity.startActivity() { startActivity(Intent(this, T::class.java)) } //usage startActivity()
阅读更多关于在另一个SO问题的reified
,我回答: https : //stackoverflow.com/a/45952201/8073652
再一次: 您不能使用从Java输入的inline
函数。
inline reified
函数在编译之后会“消失”,因为在JVM上不存在指定types。 这是编译器的一个窍门。
私有函数的唯一原因可能是如果有人试图在运行时覆盖它,就会导致错误,因为该函数是完全内联的,不能被覆盖。