对空数组kotlin进行types推断

假设我有一段代码:

fun temp2 (li : MutableList):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,我认为这是一个非常相似和简单的推论?

这不能通过智能铸造来处理,你正在使用一个max()扩展函数,它总是返回一个可为空的typesInt? 在你的情况下:

 public fun > Iterable.max(): T? 

编译器会执行此方法签名所暗示的内容:它使您处理可能的null 。 编译器应该如何知道maxher是否按照预期工作? 它可能被错误地执行。

另一方面,下面的工作得益于智能铸造:

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