此代码打印" 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)
答案 0 :(得分:1)
您的要求是矛盾的。您希望能够为任何B指定一个返回类型B值的函数(实际上它本身是不可能的;唯一可能的函数是一个总是抛出异常的函数),并且您还希望编译器是当你没有给编译器任何可以确定的信息时,能够推断出B是什么。在您的示例中:
val greeting = parseInput(1)
println(greeting)
...零信息从中可以确定编译器可以确定greeting
变量需要具有的类型。在这种情况下,没有任何逻辑可以替代Unit
或任何其他特定类型;相反,正如您在评论中正确评论的那样,此代码无法编译。
如果您希望greeting
在这种情况下为Unit
,您只需重载该功能即可实现此目的:
fun <A> parseInput(raw: A) {
}
此功能将返回Unit
,为您提供您正在寻找的确切行为。