Функция расширения с другой сигнатурой путает с другой функцией расширения в kotlin - PullRequest
0 голосов
/ 03 марта 2020
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") 

enter image description here

, используя всплывающее окно завершения кода и выбирая вторую функцию расширения, он снова вызывает

fun Example.extensionFun()

, и, таким образом, мне не удалось вызвать вторая функция расширения, которая передает другое значение для testArgumet (аргумент). например,

example.extensionFun("different value")

, но во многих случаях мы не хотим изменять значение по умолчанию параметра функции при его вызове.

Я думаю, что нашел ошибку но, пожалуйста, поделитесь своим мнением

1 Ответ

3 голосов
/ 03 марта 2020

Когда это неоднозначно, компилятор вызывает перегрузку, у которой меньше аргументов. На самом деле, я не думаю, что он даже генерирует перегрузки для сигнатур функций, которые уже явно объявлены. Вероятно, они должны предоставить предупреждение компилятора, чтобы вы знали, что значение по умолчанию бессмысленно, но, возможно, это было сочтено слишком дорогим для времени компиляции.

Ваш единственный вариант - использовать другое имя функции, чтобы устранить неоднозначность.

...