对Scala的NOTNULL性状文库支持(Library support for Scala'

2019-08-17 07:45发布

注意事项:由于斯卡拉2.11, NotNull已经过时了。

据我了解,如果你想引用类型为非空的,你必须混入魔法NotNull特点,编译器会自动阻止你把null -able值了。 看到这个邮件列表线程的实例。

什么欠缺的是,对于非可空类型一个像样的图书馆的支持。 如果我想编写一个包,不需要直接接口的Java代码,我想阻止这个包中的所有类型使用null默认情况下,我别无选择,只能重新定义所有builting变量,像这样

//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
...

我希望斯卡拉有(如编译器插件,或库)选项我写

import collections.notnull._

为了容易不允许null在一个特定的文件阶使用。

是否有一个选项可以轻松地迫使许多有用的类型在标准库是不是空的?

Answer 1:

我真的不知道这笔交易是什么NotNull ,但我得到的印象是,斯卡拉还没有完全制定出应当如何应对NOTNULL /可空的概念。 我自己的政策是在Scala中从来不使用空,如果你调用一个Java API,它可能返回null, 将其转换为一个Option

该实用程序的方法是我最好的朋友:

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

然后,你做的东西是这样的:

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

我觉得这不是试图跟踪的内容可能会或可能不会是空远simplier。

所以,我没有回答你的问题的,但是我这个消息传给其他情况下,它是非常有用的...

更新 :最近的斯卡拉版本现在支持该标准的API中:

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


文章来源: Library support for Scala's NotNull trait
标签: scala notnull