为什么我被迫使用!! 在空检查的组合?

Ped*_*roD 3 kotlin

对于这段代码,Kotlin迫使我处理无效检查情况,而在另一条线上则没有,尽管情况相同:

if (r1 == null && r2 == null)
    throw IllegalArgumentException("All nulls!")
else if (r1 == null)
    return r2!!.reading // <----- I am forced to !! here
else if (r2 == null)
    return r1.reading // <----- The compiler does not complain in this line
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是一个功能?

yol*_*ole 7

Kotlin编译器没有以你期望的方式做出逻辑推断:"我已经检查过r1 == null和r2 == null,所以现在如果我只检查r1 == null,那么它必须识别出r2不是空的".它没有.您尚未检查该分支中的r2,因此它不会看到它不为空.

在第二种情况下,情况更简单:if (r1 == null) { ... } else { ... }.你在里面有另一张支票并不重要else; 编译器看到您在检查的else分支中if (x == null)并且理解该值不为空.

有一个开放的功能请求添加这种逻辑,但是,它不是Kotlin团队的近期路线图.