Generics 如何为Kotlin中带有泛型的命名lambda参数设置默认lambda函数?
此代码打印“Hello 1”Generics 如何为Kotlin中带有泛型的命名lambda参数设置默认lambda函数?,generics,lambda,kotlin,anonymous-function,named-parameters,Generics,Lambda,Kotlin,Anonymous Function,Named Parameters,此代码打印“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(r
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)
}
你的要求是矛盾的。您希望能够指定一个函数,该函数为任何B返回类型为B的值(实际上,这本身是不可能的;唯一可能的函数是总是抛出异常的函数),你还想让编译器在没有给编译器任何信息的情况下推断出B是什么。在您的示例中:
val greeting = parseInput(1)
println(greeting)
…编译器可以从零信息中确定greeting
变量需要的类型。在这种情况下,没有任何逻辑可以替代单元
或任何其他特定类型;相反,正如您在注释中正确指出的,此代码无法编译
在这种情况下,如果希望问候语
成为单位
,只需重载函数即可:
fun <A> parseInput(raw: A) {
}
输入(原始:A){
}
此函数将返回
单位
,为您提供所需的确切行为。您希望将什么指定为默认值?默认值只能是从任意到任意的函数,并且没有太多适合此签名的有用函数。似乎您甚至不能将(Any)->Any
函数作为默认值。由于涉及泛型,因此需要一个泛型(a)->B
函数,然后强制调用方指定泛型类型,因为无法推断B
。至于这个默认函数的实现,您可以将某个内容强制转换到它内部的B
(这可能不会成功),或者让它返回Nothing
(这不是您想要的)。@yole,一个void,单位对于默认值是很好的。所以在第二个示例中,您希望问候语
等于单位
?这有什么用?@yole,是的,它没有用,但我希望它在调用函数时如果没有提供它就没有用。我的目标是使第二个函数成为可选的,这就是为什么我希望一个默认的lambda函数返回UnitOverloading可以工作的原因,但这不是我想要的。如果我有一些其他逻辑需要在此parseInput
中处理?我将不得不在重载函数中复制它们。我可以将公共逻辑移到另一个函数中,该函数可以在重载函数中调用parseInput
,但我也不想这样做。parseInput(1,::toGreeting)
起作用,因为toGreeting提供了要返回的类型。您是对的,parseInput(1)
失败是因为没有向编译器提供类型来推断B是什么。这又回到了问题,有没有办法提供一个默认函数,比如在函数签名中显示?没有办法指定一个默认函数,让编译器从该默认函数中获取类型参数。如果有办法的话,那就太好了!在这里我想说的是,能够做有趣的parseInput(raw:A,toB:(raw:A)->B={it}):B{}
将非常好,在这种情况下,很明显B与A是同一类型的。
fun <A> parseInput(raw: A) {
}