理想情况下,我认为注释掉的 if 语句更有意义,至少对我而言。我的意思是,如果有人问我 null 是否大于 0,我会回答不。或者如果 null 为真,那么也不是。但是这些并没有像我预期的那样工作,并引发编译错误。所以,我已经改变了下面的那些。但那些看起来并不好或简洁。有没有更好的方法来处理这些?

class Result(val code:Int)
{
}
fun getResult():Result?
{
    return null;
}
fun main(args: Array<String>)
{
    var result = getResult();
    var success:Boolean? = null;

    //if(result?.code > 0)
    if(result?.code?:0 > 0)
    {
        print("Good.");
    }

    //if(success)
    if(success == true)
    {
        print("Good.");
    }
}

最佳答案

注释掉的代码无法编译的原因是因为 result?.code 可以为空,并且您不能在可空表达式上调用比较运算符(即本例中的 >),因为它们的类型不匹配。 (它被定义为只接受不可为空的类型)

Kotlin 完全消除了可空实体和不可空实体之间的歧义。因此,在编译时 kotlin 编译器拒绝编译,如果您将某些内容与可空类型进行比较,以避免提前运行时异常。在Java中,

Integer x = null;
System.out.println(x > `)
这会编译但在运行时抛出 NullPointerException ,这显然是您不想要的。 Kotlin 编译器在这里很聪明,通过拒绝编译来避免此类运行时异常。
现在讨论更好的处理方法,就像大家说的那样,使用 let 是一种合适的方法。一种更简单的方法可以是使用 if 表达式进行常规空检查
if(result != null && result.code > 0) {
    print("Good.");
}

关于Kotlin:检查可空值在 if 语句中是否有效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48435159/

10-10 22:41