图书馆支持Scala的NotNull特性

Ela*_*ich 14 scala notnull

注意:从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
...
Run Code Online (Sandbox Code Playgroud)

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

import collections.notnull._
Run Code Online (Sandbox Code Playgroud)

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

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

Lac*_*lan 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)
Run Code Online (Sandbox Code Playgroud)

然后你做这样的事情:

val foo: Option[Foo] = ?(getFooFromJavaAPIThatMightReturnNull())
Run Code Online (Sandbox Code Playgroud)

我发现这比试图追踪可能会或可能不会是null的更简单.

所以我根本没有回答你的问题,但是如果它有用的话我会通过这个问题......

更新:更新的 Scala版本现在支持标准API:

val foo: Option[Foo] = Option(getFooFromJavaAPIThatMightReturnNull())
Run Code Online (Sandbox Code Playgroud)

  • `Option.apply`与```函数做同样的事情. (6认同)
  • 确实,但这是在Option.apply存在之前编写的. (2认同)
  • 使用Option是一种普遍接受的方法来处理可能不返回任何内容的函数,但它仍然意味着你必须处理`foo`返回`None`的情况,并将调用`foo`的代码改为`match`或` '选项`上的map`.如果你知道foo真的*永远不会*返回`null`,那么这会让你的代码变得复杂.使用简单的标签`Foo with NotNull`可以为您提供编译器运行额外检查所需的语义,而不会要求您更改调用代码中的任何内容.请参阅[此答案]中的解决方案(http://stackoverflow.com/a/18604521/618089). (2认同)