我们知道Kotlin允许我们使用默认参数,但它如何确定重载发生时调用哪个函数呢?如下所示,结果是调用了前test个,而不是第二个,但为什么呢?

fun test() {

}

fun test(a: Int = 1) {

}
fun main() {
    test()
}

推荐答案

Kotlin语言规范规定了overload resolution的规则.

首先,它说是the general rule:

编译器应首先挑选多个重载候选对象,这些候选对象 形成可能预期的可调用集合(过载候选集合, OCS),然后根据 函数和调用参数的类型.

然后,稍后在解释如何确定最具体的功能时,it states:

对于每个候选者,我们不计算默认参数的数量 在调用中指定(即,我们使用的参数的数量 缺省值).人数最少的候选人 未指定的默认参数是更具体的候选参数

这就对了.在您的示例中,将 Select 不带默认参数的test()函数,因为它的非指定默认参数数量较少,因此更加具体.

Kotlin相关问答推荐

Kotlin Coroutine()是如何工作的?S阻止了.

如何检测一个值是否是Kotlin中的枚举实例?

Kotlin:我可以将函数分配给 main 的伴随对象中的变量吗?

Kotlin 函数中接收者和参数的类型相同

Jetpack Compose - 单击 LazyColumn 的项目时应用程序崩溃

kotlin 如何决定 lambda 中的参数名称?

如何在 Compose 中创建可重用的修饰符?

如何从 Java 中隐藏 Kotlin 的 lateinit var 支持字段?

Kotlin 静态函数:伴生对象,@JvmStatic @JvmField

Kotlin 顶级函数与对象函数

将 Firebase 数据快照反序列化为 Kotlin 数据类

在kotlin中,如何模拟封装回调函数?

如何在Kotlin中创建填充空值的通用数组?

项目未与 Gradle 链接

在kotlin中初始化类变量的正确位置是什么

在 Kotlin 中创建非绑定服务

查找是否在列表中找到具有特定属性值的元素

Kotlin var lazy init

为什么 Kotlin 会收到这样的 UndeclaredThrowableException 而不是 ParseException?

类型推断失败:RecyclerViewActions.scrollTo()