为什么这里没法类型推导


#1

将最后一个lambda表达式移到括号外不是单纯的语法糖么?
为什么这样会失败?

val naturalNumbers= generateSequence(0){Int::inc}
    error: type inference failed: Cannot infer type parameter T in fun <T : Any> generateSequence(seed: T?, nextFunction: (T) -> T?): Sequence<T>
    None of the following substitutions
    (KFunction1<Int, Int>?,(KFunction1<Int, Int>) -> KFunction1<Int, Int>?)
    (Int?,(Int) -> Int?`
    (Any?,(Any) -> Any?)
    can be applied to
    (Int,(Int) -> KFunction1<Int, Int>)

而这样却可以
val naturalNumbers= generateSequence(0,Int::inc)


#2

大兄弟。。。下次先好好排下版。。。

最后一个参数是个函数类型,你可以写Lambda,也可以写函数引用。

Lambda 要传入一个 整型,返回一个整型,即类型为 (Int) -> Int,所以正确的写法是:

val seq = generateSequence(0){
    it.inc()
}

generateSequence(0,Int::inc) 当中,Int::inc 就是一个函数引用,所以可以直接传入,因为它的类型本身就是 KFunction1<Int, Int>,或者说 (Int) -> Int。


京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务