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