如何在 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
,为您提供所需的确切行为。
此代码打印 "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
,为您提供所需的确切行为。