Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Scala'的库支持;非零特征_Scala_Notnull - Fatal编程技术网

对Scala'的库支持;非零特征

对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

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

据我所知,如果希望引用类型不可为null,则必须混合magic
NotNull
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())