'Type' へのスマートキャストは不可能です。'variable' はこの時点で変更されている可能性がある可変プロパティであるためです。質問する

'Type' へのスマートキャストは不可能です。'variable' はこの時点で変更されている可能性がある可変プロパティであるためです。質問する

Kotlin 初心者は、「次のコードはなぜコンパイルされないのか」と尋ねます。

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

「left」はこの時点で変更されている可能性がある可変プロパティであるため、「Node」へのスマートキャストは不可能です。

これは可変変数であることはわかりますleftが、明示的にチェックしていてleft != nullleft型であるのにNode、なぜその型にスマートキャストできないのでしょうか?

これをうまく修正するにはどうすればいいでしょうか?

ベストアンサー1

left != nullとの実行の間に、queue.add(left)別のスレッドが の値をleftに変更した可能性がありますnull

これを回避するには、いくつかのオプションがあります。以下にいくつか例を挙げます。

  1. スマートキャストでローカル変数を使用します。

     val node = left
     if (node != null) {
         queue.add(node)
     }
    
  2. 使う安全な通話次のいずれかのようになります。

     left?.let { node -> queue.add(node) }
     left?.let { queue.add(it) }
     left?.let(queue::add)
    
  3. 使用エルヴィスオペレーターreturn戻る囲んでいる関数から早期に:

     queue.add(left ?: return)
    

    breakループ内のチェックにもcontinue同様に使用できることに注意してください。

おすすめ記事