在空数组kotlin上进行类型推断

时间:2018-01-27 15:50:01

标签: kotlin nullable

假设我有一段代码:

fun temp2 (li : MutableList<Int>):Int {
    if (li.isEmpty()) return 0
    val pos=li.filter { it>0 }
    val neg=li.filter { it<0 }

    if (pos.isEmpty() && neg.isNotEmpty()){

        // this gives compiling error because Required: Int, Found: Int?
        // But I just checked one line higher that neg is Not Empty, so there (at least I guess) 
       // no possible way to have an NPE?
        //return neg.max()
          return neg.max()!! //this works fine
    }

有没有特别的理由为什么编译器不会推断.max()只能产生一个Int,因此这不应该是一个错误,或者我错过了什么? Kotlin的文档自豪地指出了Smart Casts,我认为这是一个非常类似且易于推理的内容吗?

1 个答案:

答案 0 :(得分:4)

智能广告无法处理,您使用max()扩展函数,该函数始终返回可为空的类型,Int?在您的情况下:

public fun <T : Comparable<T>> Iterable<T>.max(): T? 

编译器执行此方法签名建议的内容:它使您可以处理可能的null。编译器应该如何知道max是否按预期工作?它可能被错误地实施。

另一方面,以下工作归功于智能铸造:

val maxNeg: Int? = li.filter { it < 0 }.max()
if (maxNeg != null) {
    return maxNeg //Can be used as Int
}