Kotlin新手问:“为什么下面的代码不能编译?”:

var left: Node? = null
    
fun show() {
    if (left != null) {
        queue.add(left) // ERROR HERE
    }
}

智能转换为'Node'是不可能的,因为'left'是可变的 此时可以更改的属性

我得到left is mutable变量,但我显式检查left != null left是Node类型,为什么它不能被智能转换为这种类型?

我该如何优雅地解决这个问题?


当前回答

这招对我很管用: private lateinit var varName:字符串

其他回答

尝试使用非空断言操作符…

queue.add(left!!) 

这样做:

var left: Node? = null

fun show() {
     val left = left
     if (left != null) {
         queue.add(left) // safe cast succeeds
     }
}

这似乎是公认答案提供的第一个选项,但这正是您要寻找的。

这种方法不起作用的实际原因与线程无关。这个点就是那个节点。left被有效地转换为node.getLeft()。

这个属性getter可以定义为:

val left get() = if (Math.random() < 0.5) null else leftPtr

因此,两个调用可能不会返回相同的结果。

我会怎么写:

var left: Node? = null

fun show() {
     val left = left ?: return
     queue.add(left) // no error because we return if it is null
}

这招对我很管用: private lateinit var varName:字符串