【发布时间】:2018-08-29 16:18:27
【问题描述】:
此代码打印“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)
【问题讨论】:
-
您想指定什么作为默认值?默认值只能是从Any到Any的函数,适合这个签名的有用函数并不多。
-
这里似乎连
(Any) -> Any函数都不能作为默认值。由于涉及泛型,因此需要一个泛型(A) -> B函数,然后强制调用者指定泛型类型,因为无法推断B。至于这个默认函数的实现,你可以在其中将一些东西强制转换为B(这可能不会成功),或者让它返回Nothing(这不是你想要的在这里)。 -
@yole,一个空的,Unit 可以作为默认值。
-
所以您希望第二个示例中的
greeting等于Unit?这有什么用? -
@yole,是的,它没用,但我希望它在调用函数时没有提供它是没用的。我的目标是使第二个函数可选,这就是为什么我想要一个默认的 lambda 函数返回 Unit
标签: generics lambda kotlin anonymous-function named-parameters