Неоднозначность разрешения перегрузки ... или нет? - PullRequest
0 голосов
/ 04 июля 2018

Вот какая-то скучная перегрузка:

class Dummy() {
    fun f(x: Unit) : String = "Disco"
    fun f(x: Unit, y: Unit = Unit) : String = "Mambo"
}

Я не уверен, что понимаю почему, но это работает:

fun main(args: Array<String>) {
    println(Dummy().f(Unit))           // Echoes “Disco”
}

Однако это не так:

fun main(args: Array<String>) {
    println((Dummy::f)(Dummy(), Unit)) // Fails: “Overload resolution ambiguity”
}

Есть понимание разницы в результатах?

1 Ответ

0 голосов
/ 04 июля 2018

Когда вы звоните Dummy::f, есть два кандидата с одинаковым именем f :

fun f(x: Unit) : String = "Disco"
fun f(x: Unit, y: Unit = Unit) : String = "Mambo"

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

fun f(x: Int) : String = "Disco"
fun f(s: String) : String = "Mambo"

У вас будет проблема, потому что нет возможности вывести тип с помощью этого оператора: Dummy::f.

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


Например, если у вас есть: (разные имена)

class Dummy() {
    fun f(x: Unit) : String = "Disco"
    fun g(x: Int) : String = "Mambo"
}

fun main(args: Array<String>) {
    val f = Dummy::f
    val g = Dummy::g
}

тип f равен KFunction2<Dummy, Unit, String> и g тип KFunction2<Dummy, Int, String>

Но если вы определите: (равные имена)

class Dummy() {
    fun f(x: Unit) : String = "Disco"
    fun f(x: Int) : String = "Mambo"
}

fun main(args: Array<String>) {
    val f = Dummy::f
    val g = Dummy::f
}

У вас будет ошибка «Неоднозначность разрешения перегрузки», потому что возможности компилятора ограничены, и тип функции не может быть выведен из-за наличия двух функций с одинаковым именем. Для выяснения проблемы используется не количество аргументов, а ссылка на функцию со многими кандидатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...