如果我在类路径上有一个 jar,我在其中创建了一个扩展函数,例如 String 类,并且我在 String 上有另一个具有相同扩展函数的 jar,Kotlin 将如何解决这两者?
我想如果两个函数都定义在同一个包中,那么会有冲突吗?
但是如果不同的包,我如何区分这两个扩展?
如果我在类路径上有一个 jar,我在其中创建了一个扩展函数,例如 String 类,并且我在 String 上有另一个具有相同扩展函数的 jar,Kotlin 将如何解决这两者?
我想如果两个函数都定义在同一个包中,那么会有冲突吗?
但是如果不同的包,我如何区分这两个扩展?
事实上,如果它们在同一个包中,它将无法编译。对于另一种情况,假设您有两个包含两个不同包的文件,其中包含具有相同签名的扩展函数:
第一个文件:
package ext1
fun Int.print() = print(this)
第二个文件:
package ext2
fun Int.print() = print(this * 2)
以及您尝试使用它的文件:
package main
fun main(args: Array<String>) {
42.print()
}
IntelliJ 实际上会给您一个导入对话框,您可以在其中选择要使用的对话框:
您可以像这样导入其中一个:
import ext1.print
如果您还需要使用另一个,您可以使用as
关键字重命名它。此关键字通常适用于导入,具有相同名称的类等。
import ext2.print as print2
所以这个程序编译并打印4284
:
package main
import ext1.print
import ext2.print as print2
fun main(args: Array<String>) {
42.print()
42.print2()
}
作为一个快速说明,您使用as
关键字导入的那个会稍微难以使用,因为自动完成似乎不能很好地接受它,在这里选择第二个选项只是完成对42.print()
.
因此,由于 kotlin 中的扩展函数只是静态函数,因此其他函数将通过导入来区分。
您还可以为扩展函数之一创建别名以提高可读性:
import by.bkug.extensions.helpers.extension
import by.bkug.extensions.extension as extension1
fun test() {
myType().extension() // by.bkug.extensions.helpers.extension
myType().extention1() // by.bkug.extensions.extension
}