当前位置: 首页 > 知识库问答 >
问题:

Kotlin具体化类型函数作为函数扩展-可从Java调用?

酆奇文
2023-03-14

我正在尝试使用具体化类型的函数作为扩展函数,但我认为这是不可能的,因为在我检查生成的字节码后,我发现方法签名是私有的,有什么办法可以将其公开?

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
}

共有2个答案

杨飞
2023-03-14

编译后内联具体化函数“dispear”,因为JVM上不存在具体化类型。这是编译器的把戏。

私有函数存在的唯一原因可能是,如果有人试图在运行时覆盖它,会导致错误,因为具体化的函数是完全内联的,不能被覆盖。

范轶
2023-03-14

是的,您可以使用inline函数和refied类型作为扩展函数。它将设为私有,以便Java代码无法访问它(顺便说一句,“普通”inline函数不是这种情况)。对于静态编程语言,这样的inline函数可以是私有,因为内联函数被复制到调用它们的地方。

例如:

inline fun <reified T : Activity> Activity.startActivity() {
    startActivity(Intent(this, T::class.java))
}

//usage

startActivity<DetailActivity>()

在另一个SO问题中,我回答:https://stackoverflow.com/a/45952201/8073652

再一次:您不能将内联函数与从 Java 重新类型化的函数一起使用。

 类似资料:
  • 我有一个kotlin库项目,并使用进行测试。在我的测试中,我尝试使用以下函数: 是正确的行为吗?

  • 我在Kotlin文件中定义了扩展函数。 其中是(生成的)java类。现在,我想用正常的java代码访问它: 然而,那是行不通的。IDE将无法识别方法,编译失败。

  • 根据类型将函数添加到类中的惯用方法是什么。下面的示例使用 List 作为类,并使用 Type 参数

  • 当从期望SAM(单抽象方法)类型参数的Java API调用方法时,是否有一致的方法将函数文字强制为正确的类型?我发现,有时Kotlin函数可以很好地工作,而其他函数似乎没有任何一致性。 我有几个来自Ratpack API的示例: 调用ChainAction时。handler(String,handler)使用Kotlin函数文字效果很好,例如: 类型推断发现上下文是一个ratpack。处理。背景

  • 我创建了一个扩展函数, 在kotlin课堂上,我将能够以这种方式毫无问题地使用它

  • 我正在用Java构建一个库管理应用程序。 我有一个名为 的抽象类。它有一个称为 的抽象方法。 有一个名为< code>Newspaper的子类,它当然实现了< code>equals,其签名与< code>equals在< code>Material中的签名完全相同: Java无法解析< code > elementoacomparer 的任何方法。它们都存在于< code >报纸中,该报纸确实扩