gpt4 book ai didi

scala - 在 Scala 中测试数组是否为空

转载 作者:行者123 更新时间:2023-12-04 17:52:04 27 4
gpt4 key购买 nike

问题不在于如何 测试数组是否为空(arr.length == 0 可以做到这一点)。相反,我的问题是,为什么

scala> Array().isEmpty
res1: Boolean = true

工作和

scala> val x = Array[String]()
x: Array[String] = Array()
scala> x.isEmpty
res2: Boolean = true

工作,但是

scala> val y = Array()
y: Array[Nothing] = Array()

scala> y.isEmpty
<console>:13: error: value isEmpty is not a member of Array[Nothing]
y.isEmpty
^

不是吗?

最佳答案

正如@MichaelZajac 指出的那样,Nothing 是所有内容的子类型(对应的 Any 是所有内容的父类(super class)型)。特别是它也是 AnyRef 的子类型。事实上,还有一个更通用的 genericArrayOps,它根本没有类型限制(例如 Array[Any]().isEmpty 有效)!允许您使用 isEmpty 的隐式转换 应该 启动,但当然不会启动,即使显式调用转换没问题。

link @slouc 给出了答案,即 Scala 编译器在进行隐式解析时以特殊方式处理 Nothing 因为 Nothing 是进行类型推断时类型的默认下限.

现在,为什么在隐式解析中不考虑 Nothing 是可取的呢? Nothing 的棘手之处在于它是所有内容的子类型。这意味着如果 Scala 在任何时候将类型推断为 Nothing,则每个隐式转换都会立即生效。这可能会隐藏一个类型错误(你永远不应该有一个 Nothing 的实例,但是当那个 Nothing 变成一个 Int 时...说?)。 (请注意,我希望真正破解编译器的人能够介入并确认/拒绝/详细说明)

关于scala - 在 Scala 中测试数组是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41963721/

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