2017-11-25 43 views
5

Ich habe die folgende Methode. Seine Logik ist sehr einfach, wenn rechts gesetzt ist, dann rufen Sie links auf, während es einen Wert (nicht null) hat. Wenn ich es auf die folgende Weise schreibe, funktioniert es.Kotlin-Compiler kann nicht herausfinden, dass Variable in Do-While-Schleife nicht nullbar ist

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 
} 

Wenn stattdessen ich versuche, den Code zu verkürzen, eine do-while-Schleife verwenden, ist es nicht mehr Smart wirft next zu Node. Es zeigt diesen Fehler:

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

Der Code folgt:

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

Warum vereinfachst du nicht einfach 'while (next! = Null) {...}'? –

+0

Sie haben Recht! Ich habe es nicht gesehen. – biowep

Antwort

-1

Der Compiler wahrscheinlich davon ausgegangen, dass im nächsten zwischen der if-Anweisung und der Schleife von einem anderen Thread geändert werden kann. Da Sie versichern können, dass next nicht null ist, fügen Sie einfach hinzu !! zum nächsten, wenn es in der Schleife verwendet wird: nächste !!

+0

Dann kann es auch zwischen Zustand und der Zuordnung 'prev = next' wechseln – biowep

+0

@biowep prev = next !! sollte passen, sollte es nicht? – Zonico

+0

Sicher, das ist es, aber es ist eine Arbeit um ein nicht kohärentes Verhalten, es führt auch eine nicht notwendige Kontrolle ein. – biowep

Verwandte Themen