gpt4 book ai didi

kotlin - 为什么编译器认为这个 if 语句是一个表达式?

转载 作者:IT老高 更新时间:2023-10-28 13:45:58 24 4
gpt4 key购买 nike

我有这种方法可以比较已排序的列表并告诉您列表 2 中缺少列表 1 中的哪些项目,反之亦然,在 O(N) 时间内:

fun <T : Comparable<T>> compareSortedLists(
list1: Iterable<T>,
list2: Iterable<T>,
onlyInList1: MutableCollection<T>,
onlyInList2: MutableCollection<T>) {
val it1 = PeekingIterator(list1.iterator())
val it2 = PeekingIterator(list2.iterator())
while (it1.hasNext() && it2.hasNext()) {
val comp = it1.peek().compareTo(it2.peek())
if (comp < 0) // <-- ERROR: type inference failure
onlyInList1.add(it1.next())
else if (comp > 0)
onlyInList2.add(it2.next())
else {
it1.next()
it2.next() // <---- Error: type mismatch
}
}
it1.forEachRemaining { onlyInList1.add(it) }
it2.forEachRemaining { onlyInList2.add(it) }
}

IntelliJ IDEA 2018.1.4 中的 Kotlin 编译器 (1.2.41) 给了我一个编译时错误(如上所示)。错误消息说:

Type mismatch.
Required: Comparable<Boolean>!
Found: T!

但我不打算使用 if成为一种表达方式。我的意思是它是一个语句(编辑:我的意思是一个值被忽略的表达式,因为所有 if 实际上都是表达式)。如果我转换 ifwhen然后就可以编译了:

        when {                // <-- Look, no error! ;-)
comp < 0 ->
onlyInList1.add(it1.next())
comp > 0 ->
onlyInList2.add(it2.next())
else -> {
it1.next()
it2.next()
}
}

为什么它认为 if是一个表达式?而且,最重要的是,为什么它认为 Comparable<Boolean>!是必须的?需要这种类型的上下文在哪里?

最佳答案

这似乎是一个编译器错误。我在这里举报了:

https://youtrack.jetbrains.net/issue/KT-24886

这是一个最小的复制器:

fun <T : Comparable<T>> test(a: Iterable<T>) {
val x = if (booleanExpr1())
booleanExpr2()
else if (booleanExpr3())
booleanExpr4()
else {
a.iterator().next()
}
}

fun booleanExpr1() = true
fun booleanExpr2() = true
fun booleanExpr3() = true
fun booleanExpr4() = true

请注意,问题根本不在于“if 表达式不被视为语句”,而在于类型推断本身。编译器应该计算出所有 then 分支的有效上限,但失败了。

关于kotlin - 为什么编译器认为这个 if 语句是一个表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50801514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com