对Scala'的库支持;非零特征
注意:从Scala 2.11开始,对Scala'的库支持;非零特征,scala,notnull,Scala,Notnull,注意:从Scala 2.11开始,NotNull已被弃用 据我所知,如果希望引用类型不可为null,则必须混合magicNotNulltrait,编译器将自动阻止您在其中放入null-able值。看看这个例子 缺少的是对不可空类型的适当库支持。如果我想编写一个不需要直接与java代码接口的包,并且我想在默认情况下阻止该包中的所有类型使用null,那么我别无选择,只能像这样重新定义所有内置变量 //can't actually do that, but just to give the gener
NotNull
已被弃用
据我所知,如果希望引用类型不可为null,则必须混合magicNotNull
trait,编译器将自动阻止您在其中放入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._
以便在特定的scala文件中轻松禁止使用null
是否有一个选项可以轻松地强制标准库中的许多有用类型不可为null?我真的不知道如何处理
NotNull
,但我得到的印象是Scala还没有完全弄清楚它想要如何处理NotNull/null概念。我自己的策略是永远不要在Scala中使用null,如果调用可能返回null的Java API,请立即将其转换为选项
这个实用方法是我最好的朋友:
def ?[A <: AnyRef](nullable: A): Option[A] = if (nullable eq null) None else Some(nullable)
我发现这比试图跟踪可能为空或不为空的内容要简单得多
所以我根本没有回答你的问题,但我把这个传下去,以防有用
更新:较新的Scala版本现在在标准API中支持此功能:
val foo: Option[Foo] = Option(getFooFromJavaAPIThatMightReturnNull())
你可以扩展字符串吗?我以为这是期末考试,其实你不能。说得好。我想需要通过隐式转换为字符串来定义NString。我想您可能会查找类似于org.jetbrains.annotations.NotNull的内容,我也没有找到它。请检查您的方法中提出的问题解决方案是,类型系统不会强迫我不使用null。因此,我可以忘记一个JavaAPI调用,并在代码中隐藏一个null而不被发现。如果所有类型都不可为null,那么如果使用NotNullable=JavaAPIThapMightReturnNull()执行val x:String,编译器将发出提示。选项。apply
执行与?
函数相同的操作。事实上,但这是在Option.apply存在之前编写的。使用Option是处理可能不返回任何内容的函数的公认方法,但这仍然意味着您必须处理foo
返回None
的情况,并将调用foo
的代码更改为匹配
或映射
。如果您知道foo真的永远不会返回null
,那么这会使代码变得复杂。使用带有NotNull的简单标记Foo
可以提供编译器运行额外检查所需的语义,而无需更改调用代码中的任何内容。在中查看解决方案。
val foo: Option[Foo] = Option(getFooFromJavaAPIThatMightReturnNull())