Generics 如何为Kotlin中带有泛型的命名lambda参数设置默认lambda函数?

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

此代码打印“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)
}

你的要求是矛盾的。您希望能够指定一个函数,该函数为任何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) {
}