为什么在Kotlin中出现错误“Smart cast to’Long’是不可能的”? 但是,在Java中呢?

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

智能投“长”是不可能的,因为’我’是一个可变的财产,可能已经改变了这个时间

为什么?

class MyClass1(var i: Long?) { fun change(): Long? { if (i != null) { return i + 10L } else { return 5L } } } 

我用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; } } } 

因为i是一个var ,它可以理论上由你的空检查和加操作之间的另一个线程改变。

你可以使用let函数来解决它。 它将“捕捉” i的价值,把它作为一个参数let

 fun change(): Long? { return i?.let { it + 10L } ?: 5L }