为什么我在Kotlin中得到错误"Smart cast to'Long'是不可能的"?但它在Java中没问题?

Hel*_*oCW 0 java kotlin

我尝试运行以下代码,但代码无法通过编译,我收到错误:

智能转换为'Long'是不可能的,因为'i'是一个可变的属性,可以在这个时候改变

为什么?

class MyClass1(var i: Long?) {

    fun change(): Long? {
        if (i != null) {
            return i + 10L
        } else {
            return 5L
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我用Java编写了代码MyClass2,它可以很好地工作,为什么?

class MyClass2{
    private Long i;

    public MyClass2(Long k){
       i=k;
    }

    public Long change(){
       if (i!=null){
           return i+10L;
       }else {
           return 5L;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

mar*_*ran 6

因为i是a var,理论上可以通过null检查和加号操作之间的另一个线程来改变它.

您可以使用该let功能来解决它​​.它将"捕获" i它作为参数的值let.

fun change(): Long? {
    return i?.let { it + 10L } ?: 5L
}
Run Code Online (Sandbox Code Playgroud)