我们知道Kotlin允许我们使用默认参数,但是它如何确定当过载发生时调用哪个func呢?就像下面这样,结果是调用第一个test而不是第二个,但是为什么呢?
test
fun test() { } fun test(a: Int = 1) { } fun main() { test() }
x8diyxa71#
Kotlin语言规范规定了重载解析的规则。首先,它陈述了一般规则:编译器应该先挑选多个多载候选者,以形成一组可能要呼叫的函式(多载候选者集,OCS),然后根据函式的型别和呼叫参数,选择最特定的函式来呼叫。然后,在解释如何确定最具体的函数时,它指出:对于每个候选项,我们计算在调用中未指定的默认参数的数量(即,我们使用默认值的参数的数量)。具有最少数量的未指定默认参数的候选项是更具体的候选项在你的例子中,我们将选择没有默认参数的test()函数,因为它没有指定默认参数的数量较少,因此更具体。
test()
1条答案
按热度按时间x8diyxa71#
Kotlin语言规范规定了重载解析的规则。
首先,它陈述了一般规则:
编译器应该先挑选多个多载候选者,以形成一组可能要呼叫的函式(多载候选者集,OCS),然后根据函式的型别和呼叫参数,选择最特定的函式来呼叫。
然后,在解释如何确定最具体的函数时,它指出:
对于每个候选项,我们计算在调用中未指定的默认参数的数量(即,我们使用默认值的参数的数量)。具有最少数量的未指定默认参数的候选项是更具体的候选项
在你的例子中,我们将选择没有默认参数的
test()
函数,因为它没有指定默认参数的数量较少,因此更具体。