14

注意:从 Scala 2.11 开始,NotNull已弃用。

据我了解,如果您希望引用类型不可为空,则必须混合魔术NotNull特性,编译器会自动阻止您将null-able 值放入其中。例如,请参阅此邮件列表线程

缺少的是对不可为空类型的体面的库支持。如果我想编写一个不需要直接接口java代码的包,并且我想阻止这个包中的所有类型null默认使用,我别无选择,只能像这样重新定义所有构建变量

//can't actually do that, but just to give the general idea
class NString extends String with NotNull
class NMap[X,Y] extends Map[X,Y] with NotNull
...

我希望 scala 有(作为编译器插件或库)选项供我编写

import collections.notnull._

为了轻松地禁止null在特定的 scala 文件中使用。

是否有一个选项可以轻松地强制标准库中的许多有用类型不可为空?

4

1 回答 1

10

我真的不知道这是怎么回事NotNull,但我觉得 Scala 还没有完全弄清楚它想如何处理 NotNull/Nullable 概念。我自己的策略是永远不要在 Scala 中使用 null,如果您调用可能返回 null 的 Java API,请立即将其转换为Option.

这个实用方法是我最好的朋友:

def ?[A <: AnyRef](nullable: A): Option[A] = if (nullable eq null) None else Some(nullable)

然后你做这样的事情:

val foo: Option[Foo] = ?(getFooFromJavaAPIThatMightReturnNull())

我发现这比尝试跟踪可能为空或不为空的内容要简单得多。

所以我根本没有回答你的问题,但我把它传递给它以防万一......

更新:更新的 Scala 版本现在在标准 API 中支持这一点:

val foo: Option[Foo] = Option(getFooFromJavaAPIThatMightReturnNull())
于 2009-11-06T02:20:30.963 回答