Scala 3 显式 Nulls 标志使字符串操作变得非常不可用

Ota*_*ann 8 scala nullable scala-3

当使用新的 Scala 3 的 flag 时-Yexplicit-nulls,每个没有显式非 null 注释的 Java 代码都被视为可为 null,因此每个不返回基本类型的 Java 方法都会T有效返回T | Null

问题:在 Scala 中,String 只是java.lang.String. 由于核心 Java 不包含任何有关可为空性的注释,因此 Scala 3 将 String 方法的返回类型视为可为空。

示例:(通过 Scala REPL / sbt 控制台和 Gradle 进行尝试)

scala> val bla: String = null // check whether the compiler option is turned on
-- Error:
1 |val bla: String = null
  |                  ^^^^
  |                  Found:    Null
  |                  Required: String
scala> val bla: String = "hey"
val bla: String = hey
scala> bla.split("e")
val res0: Array[String | Null] | Null = Array(h, y)
Run Code Online (Sandbox Code Playgroud)

返回类型Array[String | Null] | Null完全是疯狂的。该方法的契约split显然是给出的,因为它总是返回一个数组,并且该数组总是包含至少一个字符串(并且没有一个字符串为空)。

真的是可悲的现实吗,还是我做错了什么?

为了使上述工作正常进行,我总是必须写:

"hey".split("e").nn.map(_.nn) // this would finally give me just Array[String]
Run Code Online (Sandbox Code Playgroud)

Ota*_*ann 5

我发现了一份错误报告,内容几乎与我最初在这里询问的内容相同。Dotty/Scala3 团队似乎认为这“不是一个错误”。

有人建议使用 unsafeNulls 标志。这更像是“让我们禁用我们刚刚启用的功能”。