Kotlin扩展冲突
如果我有一个jar,在类路径上,我已经创建了一个扩展函数来说参数的String类,我有另一个jar在String上具有相同的扩展函数,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 }