Kotlin 编译器无法确定变量在 do-while 循环中不可为 null

Kotlin compiler can't figure out that variable is not nullable in do-while loop

提问人:barsdeveloper 提问时间:11/26/2017 更新时间:1/29/2018 访问量:176

问:

我有以下方法。它的逻辑非常简单,如果设置了 right,则在它有一个值(不是 null)时调用 left。当我以以下方式编写它时,它起作用了。

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 循环缩短代码,则它不再智能转换为 .它显示以下错误:nextNode

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
}
null kotlin do-while nullable

评论

2赞 Alexey Romanov 11/26/2017
你为什么不简化为只是?while (next != null) { ... }
0赞 barsdeveloper 11/26/2017
你是对的!我没看到。

答:

-1赞 Zonico 11/26/2017 #1

编译器可能假定 next 可以在 if 语句和来自另一个线程的循环之间更改。 由于您可以确保 next 不为 null,因此只需添加 !!在循环中使用它时,到下一个:下一步!!

评论

0赞 barsdeveloper 11/26/2017
然后它也可以在 while 条件和 assingment 之间切换prev = next
0赞 Zonico 11/26/2017
@biowep 上一页 = 下一页!!应该适合,不是吗?
0赞 barsdeveloper 11/26/2017
当然,它确实如此,但它是围绕非连贯行为的工作,也确实引入了不必要的控制。
0赞 Ilya 12/30/2017
这是一个局部变量,它不会泄漏到函数外部,因此无法在另一个线程中更改它。next