考虑以下代码:
fun foo(type: Class<out Any> = Any::class.java) {
}
inline fun <reified T : Any> foo() {
}
fun main() {
foo() // ERROR!
}
此代码会导致以下错误:
类型推断失败:没有足够的信息来推断内联乐趣foo(): Unit中的参数T
请明确指定。
为什么编译器不使用默认参数默认为非内联函数?
每当我们调用一个函数并且有多个重载都匹配时,静态编程语言更喜欢它认为是最具体的重载。例如,它更喜欢接收更具体参数类型(子类型)的函数,而不是更泛型类型(超类型)。
同样,如果编译器必须用默认值替换缺失的参数,它会认为它不太精确匹配。它更喜欢我们在函数定义中使用参数的候选者。这在留档中描述:
对于每个候选我们统计调用中未指定的默认参数个数(即我们使用默认值的参数个数)。非指定默认参数个数最少的候选是更具体的候选;
https://kotlinlang.org/spec/overload-resolution.html
函数是否内联、是否使用具体化参数或类型参数未知都无关紧要。