具有不同签名的扩展函数与 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")
但是很多情况下我们在调用的时候并不想改变函数参数的默认值
我想我发现了一个错误,但请分享您的意见
当它不明确时,编译器会调用参数较少的重载。事实上,我认为它甚至不会为已经显式声明的函数签名生成重载。他们可能应该提供编译器警告,让您知道默认值毫无意义,但也许这被认为对编译时间来说太昂贵了。
您唯一的选择是使用不同的函数名称来消除歧义。
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")
但是很多情况下我们在调用的时候并不想改变函数参数的默认值
我想我发现了一个错误,但请分享您的意见
当它不明确时,编译器会调用参数较少的重载。事实上,我认为它甚至不会为已经显式声明的函数签名生成重载。他们可能应该提供编译器警告,让您知道默认值毫无意义,但也许这被认为对编译时间来说太昂贵了。
您唯一的选择是使用不同的函数名称来消除歧义。