提问者:小点点

静态编程语言内联函数调用vs带有默认类型参数的函数调用


考虑以下代码:

fun foo(type: Class<out Any> = Any::class.java) {

}

inline fun <reified T : Any> foo() {

}

fun main() {
    foo() // ERROR!
}

此代码会导致以下错误:

类型推断失败:没有足够的信息来推断内联乐趣foo(): Unit中的参数T

请明确指定。

为什么编译器不使用默认参数默认为非内联函数?


共1个答案

匿名用户

每当我们调用一个函数并且有多个重载都匹配时,静态编程语言更喜欢它认为是最具体的重载。例如,它更喜欢接收更具体参数类型(子类型)的函数,而不是更泛型类型(超类型)。

同样,如果编译器必须用默认值替换缺失的参数,它会认为它不太精确匹配。它更喜欢我们在函数定义中使用参数的候选者。这在留档中描述:

对于每个候选我们统计调用中未指定的默认参数个数(即我们使用默认值的参数个数)。非指定默认参数个数最少的候选是更具体的候选;

https://kotlinlang.org/spec/overload-resolution.html

函数是否内联、是否使用具体化参数或类型参数未知都无关紧要。