这是一些沉闷的重载:
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”
}
对结果差异有任何见解吗?
最佳答案
调用Dummy::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
。需要注意的是,函数引用主要用于避免创建lambda。
例如,如果您具有:(不同名称)
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
}
您将出现“重载分辨率歧义”错误,因为编译器的信息太受限制而无法从同名的两个函数中推断出正确的函数。
问题不在于参数的数量,而在于对许多候选对象使用函数引用。
关于kotlin - 重载分辨率含糊不清...,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174065/