kotlin - 重载分辨率含糊不清...

标签 kotlin overriding method-reference default-parameters

这是一些沉闷的重载:

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/

相关文章:

jQuery Mobile CSS 干扰了我的 CSS

java - 从 LambdaMetafactory 创建 BiConsumer

android - 如何修复gradle.app中的版本不兼容

generics - 用于通用列表的 Moshi 自定义适配器 <T :Enum> returns List<List<T:Enum>> instead of List<T:Enum>

java - 什么决定了重写方法的调用

vb.net - 覆盖 datagridview 上的 keydown Enter

kotlin - 为什么无法访问的语句方法不会导致编译错误?

android - 如何修复 "' dexOptions(Action<DexOptions>) : Unit' is deprecated. 设置 dexOptions 已过时。”?

java - 具有 Lambda 表达式的本地类

java - 方法引用中的参数