【问题标题】:Extension function with different signature is confusing with different extension function in kotlin具有不同签名的扩展函数与 kotlin 中的不同扩展函数混淆
【发布时间】:2020-06-15 08:02:10
【问题描述】:
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 只是调用“有趣的 Example.extensionFun()”

但即使我尝试打电话

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

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

fun Example.extensionFun()

因此它给我留下了调用第二个扩展函数的唯一方法,即通过为 testArgumet(参数)传递不同的值。例如。

example.extensionFun("different value")

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

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

【问题讨论】:

  • 这不是错误。 编译器/语言,而不是 IDE,如果你在没有字符串的情况下调用它,就无法知道你要调用哪个方法。换句话说,代码确实是模棱两可的。

标签: kotlin intellij-idea jetbrains-ide kotlin-extension


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多