具有默认参数的Kotlin函数的类型签名

具有默认参数的Kotlin函数的类型签名,kotlin,default-parameters,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 = :

假设我有:

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,从而使用默认参数调用它?

您可以为
add
创建一个lambda,该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) }

尝试在加法器上创建零参数函数包装器,我不知道kotlin中是否有一些语法糖,可以在另一个函数声明中创建临时匿名函数。类似于
…=::(()->(add()):Int{…
不知道该语言,但一般来说,制作包装似乎可以解决您的问题。是的,创建包装是可行的,但我想知道是否有一种方法可以通过类型签名来实现。我想这是不可能的。