如何在Kotlin中使用泛型为命名的lambda参数设置默认的lambda函数?

时间:2018-03-20 17:59:10

标签: generics lambda kotlin anonymous-function named-parameters

此代码打印" Hello 1"。 parseInput有两个泛型类型,第一个arg是第一个泛型类型A的简单对象,第二个arg是一个函数,它假设将泛型类型A更改为泛型B.你可以看到它工作正常以下。

fun toGreeting(input : Int) : String {
    return "hello " + input
}

fun <A, B> parseInput(raw : A, toB : (raw : A) -> B) : B {
    return toB(raw)
}

fun main(args: Array<String>) {
    val greeting = parseInput(1, ::toGreeting)
    println(greeting)
}

问题是如何为parseInput中的第二个命名参数提供默认的lambda值。所以我可以通过提供第一个参数来调用这个函数,并让它使用默认的lambda函数。

val greeting = parseInput(1)
println(greeting)

1 个答案:

答案 0 :(得分:1)

您的要求是矛盾的。您希望能够为任何B指定一个返回类型B值的函数(实际上它本身是不可能的;唯一可能的函数是一个总是抛出异常的函数),并且您还希望编译器是当你没有给编译器任何可以确定的信息时,能够推断出B是什么。在您的示例中:

 val greeting = parseInput(1)  
 println(greeting)

...零信息从中可以确定编译器可以确定greeting变量需要具有的类型。在这种情况下,没有任何逻辑可以替代Unit或任何其他特定类型;相反,正如您在评论中正确评论的那样,此代码无法编译。

如果您希望greeting在这种情况下为Unit,您只需重载该功能即可实现此目的:

fun <A> parseInput(raw: A) {
}

此功能将返回Unit,为您提供您正在寻找的确切行为。