使用默认参数键入Kotlin函数的签名

假设我有:

fun addInvoker(adder: () -> Int = ::add): Int{ return adder() } fun add(num1:Int = 1, num2:Int = 1): Int{ return num1 + num2 } 

我得到一个错误,因为:: add有两个参数,但addInvoker的签名要求它有零参数。 但是,如果我将其更改为:

 fun addInvoker(adder: (Int, Int) -> Int = ::add): Int{ return adder() } fun add(num1:Int = 1, num2:Int = 1): Int{ return num1 + num2 } 

然后我不能调用加法器(),也就是用默认参数调用add。

那么,有什么办法可以使::添加默认参数到invokeAdder,但仍然调用添加与adder() ,从而调用它的默认参数?

你可以创建一个你的add的lambda,它将是无参数的函数, add使用默认参数{ add() }来调用add

完整的代码:

 fun addInvoker(adder: () -> Int = { add() }): Int { return adder() } fun add(num1: Int = 1, num2: Int = 1): Int { return num1 + num2 } 

在Kotlin中,具有默认参数的函数在类型系统中没有特殊的表示,所以唯一的选择是让包装只传递一部分参数给它们:

 val add0: () -> Int = { add() } val add1: (Int) -> Int = { add(num1 = it) } val add2: (Int) -> Int = { add(num2 = it) }