如果我有一个jar,在类路径上,我已经创建了一个扩展函数,比如String类,为了参数的缘故,我在String上有另一个具有相同扩展函数的jar,怎么会科特林解决了这两个问题?
我认为如果两个函数都在相同的包中定义,那么会发生冲突吗?
但如果不同的包,我怎么能区分这两个扩展?
答案 0 :(得分:17)
实际上,如果它们在同一个包中,它将无法编译。对于另一种情况,假设您有两个包含两个不同包的文件,其中包含具有相同签名的扩展函数:
第一档:
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
关键字导入的关键字会稍微难以使用,因为自动完成功能似乎不能很好地提取它,选择第二个选项只需完成对{的调用{1}}。
答案 1 :(得分:3)
因此,由于kotlin中的扩展函数只是静态函数,因此其他函数将通过导入进行区分。
此外,您还可以为其中一个扩展函数创建别名,以提高可读性:
SELECT TYPE, Avg(pages) AS "Average Pages"
FROM titles
GROUP BY TYPE;
HAVING Avg(pages) > 500