2017-11-25 88 views
5

Aşağıdaki yönteme sahibim. Mantığı çok basittir, eğer sağ ayarlanmışsa o zaman bir değeri vardır (null değil). Bunu aşağıdaki şekilde yazdığımda işe yarıyor. Yerine, bir do-while döngüsü kullanarak kodu kısaltmak çalışırsanızKotlin derleyici, değişkenin do-while döngüsünde null olarak olmadığını çözemiyor

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 
} 

, artık akıllı Node için next atmalarını. Bu hata gösterir:

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

kod aşağıda:

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

Neden sadece "while (next! = Null) {...}'? –

+0

Haklısınız! Ben onu görmedim. – biowep

cevap

-1

derleyici muhtemelen önümüzdeki eğer deyimi ve başka bir iş parçacığı döngü arasında değiştirilebilir varsayar. Bundan sonra, null olmadığını garanti edebilirsiniz, sadece ekleyin! sonraki döngüde kullanırken: sonraki !!

+0

Daha sonra koşul ve assingment 'prev = next' – biowep

+0

arasında biowep prev = next arasında değişebilir! uygun olmalı, değil mi? – Zonico

+0

Elbette, öyle, ama tutarlı olmayan bir davranış etrafında bir çalışma, aynı zamanda gerekli olmayan bir kontrol getiriyor. – biowep

İlgili konular