Scala,尽管它做对了所有事情,但不幸的是,它仍然窝藏着 Java 领域最严重的罪犯:可怕的 null 价值,通常被称为十亿美元的错误。
在 Scala 中,每个 AnyRef 值(粗略地说,Java 中的任何非原始值)都可以是 null。这样做并不习惯,任何经验丰富的 Scala 开发人员都会像瘟疫一样避免null。但它就在那里,就像一个幽灵,等着在夜间跳起来咬毫无戒心的程序员。
Array.ofDim 返回默认初始化值。对于AnyVal,这意味着它们的“零”值,因此Array.ofDim[Int] 返回一个零数组。对于AnyRef,这将返回null 的数组。
scala> var x = Array.ofDim[A](10) // Assuming A is some class
var x: Array[A] = Array(null, null, null, null, null, null, null, null, null, null)
理想情况下,您会想立即用合理的东西填充数组。或者,更好的是,使用Array.fill 方法,它的工作方式完全相同,但允许您立即初始化数组值。
请注意,Scala 3 有一个可选的编译器选项,称为 -Yexplicit-nulls,它显式标记任何可能是 null 的值,并在类型系统中使其显式。不幸的是,即使在这种模式下,Array.ofDim 似乎仍然返回一个Array[T],有效地使其类型成为 Scala 3 新的空检查器中的谎言。我的结论是ofDim 可能是作为分配空数组的“低级”原语,并且在大多数情况下应该使用fill,就像asInstanceOf 是一个低级原语一样应该避免这种情况以支持模式匹配(或者完全避免向下转换,理想情况下)。