2017-11-25 64 views
5

다음 메소드가 있습니다. 그 논리는 매우 간단합니다. 오른쪽이 설정되면 값이있는 동안 왼쪽을 호출합니다 (null이 아님). 다음과 같은 방법으로 작성하면 작동합니다. 대신, 내가 할 - while 루프를 사용하여 코드를 단축하려고하면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 
} 

는 더 이상 스마트 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