我正在尝试使用具体化类型的函数作为扩展函数,但我认为这是不可能的,因为在我检查生成的字节码后,我发现方法签名是私有的,有什么办法可以将其公开?
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
}
编译后内联具体化
函数“dispear”,因为JVM上不存在具体化类型。这是编译器的把戏。
私有函数存在的唯一原因可能是,如果有人试图在运行时覆盖它,会导致错误,因为具体化的函数是完全内联的,不能被覆盖。
是的,您可以使用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 >报纸中,该报纸确实扩