假设我有一段代码:
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,我认为这是一个非常类似且易于推理的内容吗?
答案 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
}