键入lambda参数类型的推断

时间:2017-03-20 21:38:38

标签: kotlin type-inference

Kotlin无法编译此代码,因为编译器声明“Error:Smart cast to'Nothing'是不可能的,因为'accumulator'是一个复杂的表达式”

Ye olde函数被称为你期望的函数,即我想返回indexOfMax - 但更重要的是理解为什么“智能投射”无法转换为accumulator和{{1} }

Int

修改

是的,接受的答案有效!这是解决方案:

fun indexOfMax(a: IntArray): Int? {
    return a.foldIndexed(null) { index, accumulator, element ->
        return if (accumulator is Int) {
            var i:Int = accumulator
            return if (accumulator == null) index
                   else if (element > a[i]) index
                   else accumulator
        } else accumulator
    }
}

1 个答案:

答案 0 :(得分:5)

此处accumulator的类型仅从初始值参数推断,即nullnull的类型为Nothing?。在检查accumulator的类型是Int之后,您可以将其类型智能广告到Nothing?Int的交集处,从而生成Nothing

这里的解决方案是明确指定函数类型参数,或指定参数的类型:

a.foldIndexed(null as Int?) { ...
// or
a.foldIndexed<Int?>(null) { ...