提问人:barsdeveloper 提问时间:11/26/2017 更新时间:1/29/2018 访问量:176
Kotlin 编译器无法确定变量在 do-while 循环中不可为 null
Kotlin compiler can't figure out that variable is not nullable in do-while loop
问:
我有以下方法。它的逻辑非常简单,如果设置了 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 循环缩短代码,则它不再智能转换为 .它显示以下错误:next
Node
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
}
答:
-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
评论
while (next != null) { ... }