我们知道Kotlin允许我们使用默认参数,但它如何确定重载发生时调用哪个函数呢?如下所示,结果是调用了前test
个,而不是第二个,但为什么呢?
fun test() {
}
fun test(a: Int = 1) {
}
fun main() {
test()
}
我们知道Kotlin允许我们使用默认参数,但它如何确定重载发生时调用哪个函数呢?如下所示,结果是调用了前test
个,而不是第二个,但为什么呢?
fun test() {
}
fun test(a: Int = 1) {
}
fun main() {
test()
}
Kotlin语言规范规定了overload resolution的规则.
首先,它说是the general rule:
编译器应首先挑选多个重载候选对象,这些候选对象 形成可能预期的可调用集合(过载候选集合, OCS),然后根据 函数和调用参数的类型.
然后,稍后在解释如何确定最具体的功能时,it states:
对于每个候选者,我们不计算默认参数的数量 在调用中指定(即,我们使用的参数的数量 缺省值).人数最少的候选人 未指定的默认参数是更具体的候选参数
这就对了.在您的示例中,将 Select 不带默认参数的test()
函数,因为它的非指定默认参数数量较少,因此更加具体.