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 }