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

How to set default lambda function for named lambda argument with generics in Kotlin?

此代码打印 "Hello 1"。 parseInput 有两个泛型类型,第一个参数是第一个泛型类型 A 的简单对象,第二个参数是一个假设将泛型类型 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)

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

 val greeting = parseInput(1)  
 println(greeting)

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

如果你希望greeting在这种情况下成为Unit,你可以通过简单地重载函数来实现:

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

此函数将 return Unit,为您提供所需的确切行为。