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

时间:2016-03-30 00:20:02

标签: kotlin default-parameters

让我说我有:

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
}

然后我不能调用adder(),即使用默认参数调用add。

那么,有什么方法可以制作::将默认参数添加到invokeAdder但是仍然使用adder()调用add,从而使用默认的args调用它?

1 个答案:

答案 0 :(得分:8)

你可以使add的lambda为无参数函数,并使用默认参数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) }