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

时间:2017-09-11 14:46:53

标签: java kotlin kotlin-android-extensions kotlin-reified-type-parameters

我正在尝试使用具有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
}

2 个答案:

答案 0 :(得分:5)

是的,您可以使用inline类型的reified函数作为扩展函数。它是private,因此 Java 代码无法访问它(顺便说一句,这不是“普通”inline函数的情况)。 对于 Kotlin ,此inline函数可以private,因为内联函数已复制 < <强>调用

example

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上不存在已知类型。这是编译器的一个技巧。

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