Kotlin延伸冲突

Big*_*una 8 java kotlin kotlin-extension

如果我有一个jar,在类路径上,我已经创建了一个扩展函数,说出String类为了参数的缘故,我在String上有另一个具有相同扩展函​​数的jar,Kotlin如何解析这两个?

我假设如果两个函数都在同一个包中定义,那么会发生冲突吗?

但如果不同的包,我怎么能区分这两个扩展?

zsm*_*b13 18

实际上,如果它们在同一个包中,它将无法编译.对于另一种情况,假设您有两个包含两个不同包的文件,其中包含具有相同签名的扩展函数:

第一档:

package ext1

fun Int.print() = print(this)
Run Code Online (Sandbox Code Playgroud)

第二档:

package ext2

fun Int.print() = print(this * 2)
Run Code Online (Sandbox Code Playgroud)

这个文件你要尝试使用它:

package main

fun main(args: Array<String>) {
    42.print()
}
Run Code Online (Sandbox Code Playgroud)

IntelliJ实际上会为您提供一个导入对话框,您可以在其中选择要使用的对话框:

在此输入图像描述

您可以像这样导入其中一个:

import ext1.print
Run Code Online (Sandbox Code Playgroud)

如果您还需要使用另一个,可以使用as关键字重命名.此关键字适用于一般的导入,具有相同名称的类等.

import ext2.print as print2
Run Code Online (Sandbox Code Playgroud)

所以这个程序编译和打印4284:

package main

import ext1.print
import ext2.print as print2

fun main(args: Array<String>) {
    42.print()
    42.print2()
}
Run Code Online (Sandbox Code Playgroud)

作为一个快速说明,使用as关键字导入的那个将稍微难以使用,因为自动完成似乎不能很好地选择它,在这里选择第二个选项只需完成对该调用42.print().

在此输入图像描述


Rus*_*lan 5

因此,由于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
}
Run Code Online (Sandbox Code Playgroud)