1. ホーム
  2. コトリン

[解決済み] '変数'が変更可能なプロパティであるため、'型'へのスマートキャストは不可能である。

2022-05-05 20:03:04

質問

そしてKotlin初心者は、「なぜ次のコードはコンパイルされないのですか?

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

Node'へのスマートキャストは不可能で、'left'は変更可能だからです。 この時までに変更された可能性のあるプロパティ

私はそれを得る left はミュータブル変数ですが、私は明示的に left != nullleft は、タイプ Node なぜその型にスマートキャストされないのでしょうか?

どうすればエレガントに修正できますか?

どのように解決するのですか?

を実行する間に left != nullqueue.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)
    
    

    なお breakcontinue は、ループ内のチェックにも同様に使用できます。