use*_*931 5 scala scala-collections
问题不在于如何测试数组是否为空(arr.length == 0这很好)。相反,我的问题是,为什么
scala> Array().isEmpty
res1: Boolean = true
Run Code Online (Sandbox Code Playgroud)
工作和
scala> val x = Array[String]()
x: Array[String] = Array()
scala> x.isEmpty
res2: Boolean = true
Run Code Online (Sandbox Code Playgroud)
工作,但是
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
^
Run Code Online (Sandbox Code Playgroud)
才不是?
正如@MichaelZajac 指出的那样,Nothing是所有事物的子类型(它的对应物Any是所有事物的超类型)。特别是它也是 的子类型AnyRef。事实上,还有一个更通用的方法genericArrayOps,它根本没有类型限制(例如Array[Any]().isEmpty作品)!允许您使用的隐式转换isEmpty 应该会启动,但当然不会,即使显式调用转换就可以了。
@slouc 给出的链接就是答案,即 Scala 编译器在执行隐式解析时以特殊方式处理,因为是执行类型推断时类型的默认下限。NothingNothing
现在到底为什么不希望Nothing在隐式解析中考虑呢?棘手的是Nothing,它是所有事物的子类型。这意味着,如果 Scala 在任何时候将类型推断为Nothing,则每个隐式转换都会立即变得有效。这可能会隐藏类型错误(您永远不应该拥有 的实例Nothing,但是当它Nothing变成Int......那么谁说呢?)。(请注意,我希望有人能够真正破解编译器并介入并确认/否认/详细说明这一点)
| 归档时间: |
|
| 查看次数: |
8264 次 |
| 最近记录: |