2017-11-25 65 views
5

私は以下の方法を持っています。そのロジックは非常に簡単です。もしrightが設定されていれば、それは値(nullではない)を持っている間にleftを呼び出します。私が次のように書くと、うまくいきます。Kotlinコンパイラはdo-whileループで変数がnullableでないことを理解できません

fun goNext(from: Node): Node? { 
    var prev : Node = from 
    var next : Node? = from.right 
    if (next != null) { 
     prev = next 
     next = next.left 
     while (next != null) { 
      prev = next 
      next = next.left 
     } 
    } 
    return prev 
} 

、代わりに、私はDO-whileループを使用してコードを短くしようとすると、それはもはやスマートNodenextをキャストしていません。これは、このエラーを示しています

Type mismatch. 
Required: Node<T> 
Found: Node<T>? 

コードは次のとおりです。

fun goNext(from: Node): Node? { 
    var prev : Node = from 
    var next : Node? = from.right 
    if (next != null) { 
     do { 
      prev = next // Error is here, even though next can't be null 
      next = next.left 
     } while (next != null) 
    } 
    return prev 
} 
+2

「while(next!= null){...}」だけに単純化してみませんか? –

+0

あなたは正しいです!私はそれを見ませんでした。 – biowep

答えて

-1

コンパイラは、おそらく次のif文、別のスレッドからのループの間で変更することができることを前提としています。 次はnullではないことを保証できるので、追加してください!!ループの中でそれを使うときは次へ:次へ!

+0

それはまたwhile条件とassingment 'prev = next'の間で変更することができます – biowep

+0

@ biowep prev = next !!それは合わなければならないのでしょうか? – Zonico

+0

確かにそうですが、それは非一貫性のある振る舞いを取り巻く仕事であり、必要ではない制御も導入しています。 – biowep

関連する問題