具有不同签名的扩展函数与 kotlin 中的不同扩展函数混淆

Extension function with different signature is confusing with different extension function in kotlin

class Example

fun main(){

    val example: Example = Example()

    // what function i am calling is it fun Example.extensionFun() ?
    // Or is it Example.extensionFun(string: String) ?
    example.extensionFun()

}

// first extension function
fun Example.extensionFun(){
   println("Hey i'm first extension function")
}

// second extension function
fun Example.extensionFun(testArgument: String = "test argument "){ // argument just to change the function signature
    println("Hey i'm second extension function ")
}

在上面的示例中,我创建了两个具有相同名称但不同签名的扩展函数。 当我尝试打电话时 ->

example.extensionFun()

然后 IDE 只需调用 "fun Example.extensionFun()"

但即使我尝试调用

fun  Example.extensionFun(testArgument: String ="test argument") 

通过使用代码完成弹出窗口并选择第二个扩展函数,它再次调用

fun Example.extensionFun()

因此它让我可以通过为 testArgumet(参数)传递不同的值来调用第二个扩展函数。例如

example.extensionFun("different value")

但是很多情况下我们在调用的时候并不想改变函数参数的默认值

我想我发现了一个错误,但请分享您的意见

当它不明确时,编译器会调用参数较少的重载。事实上,我认为它甚至不会为已经显式声明的函数签名生成重载。他们可能应该提供编译器警告,让您知道默认值毫无意义,但也许这被认为对编译时间来说太昂贵了。

您唯一的选择是使用不同的函数名称来消除歧义。