智能转换为“类型”是不可能的,因为“变量”是一个可以改变的可变属性

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

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

智能投到'节点'是不可能的,因为'n.left'是一个可以改变的属性,可以在这个时候改变

我得到left是可变的变量,但我明确地检查n.left != nullleftNode类型,为什么它不能被智能转换为该类型?

我怎样才能解决这个优雅? 🙂

在执行n.left != nullqueue.add(n.left)另一个线程可能n.left的值n.leftnull

要解决这个问题,你有几个选择。 这里有一些:

  1. 使用智能转换使用本地变量:

     val left = n.left if (left != null) { queue.add(left) } 
  2. 请使用以下安全呼叫之一:

     n.left?.let { left -> queue.add(left) } n.left?.let { queue.add(it) } n.left?.let(queue::add) 
  3. 使用Elvis操作符 跳转到封闭while循环的下一步:

     queue.add(n.left ?: continue)