Kotlin 初心者は、「次のコードはなぜコンパイルされないのか」と尋ねます。
var left: Node? = null
fun show() {
if (left != null) {
queue.add(left) // ERROR HERE
}
}
「left」はこの時点で変更されている可能性がある可変プロパティであるため、「Node」へのスマートキャストは不可能です。
これは可変変数であることはわかりますleft
が、明示的にチェックしていてleft != null
、left
型であるのにNode
、なぜその型にスマートキャストできないのでしょうか?
これをうまく修正するにはどうすればいいでしょうか?
ベストアンサー1
left != null
との実行の間に、queue.add(left)
別のスレッドが の値をleft
に変更した可能性がありますnull
。
これを回避するには、いくつかのオプションがあります。以下にいくつか例を挙げます。
スマートキャストでローカル変数を使用します。
val node = left if (node != null) { queue.add(node) }
使う安全な通話次のいずれかのようになります。
left?.let { node -> queue.add(node) } left?.let { queue.add(it) } left?.let(queue::add)
使用エルヴィスオペレーターと
return
に戻る囲んでいる関数から早期に:queue.add(left ?: return)
break
ループ内のチェックにもcontinue
同様に使用できることに注意してください。