是否有类型安全的方法来确保案例类的字段在Scala中不能为空?
正如问题所暗示的那样,有哪些不同的方法可以确保某人不会将 null 传递给例如案例类的某些字段。
我知道需要,但不是粉丝,因为它会引发未经检查的异常。
回答
Scala 2
由于 JVM 限制,您无法强制使用它。但是,Scala 3/Dotty
有一个有趣的选择加入功能,称为显式空值。
您可以在此处查看更多详细信息:http : //dotty.epfl.ch/docs/reference/other-new-features/explicit-nulls.html和此处:http : //dotty.epfl.ch/docs/internals/显式 nulls.html
本质上,您使用编译器标志启用此功能,-Yexplicit-nulls
然后如果您违反非空性,您的代码将不会编译:
val x: String = null // error: found `Null`, but required `String`
val x: String | Null = null // ok - Union type
此外,它们对 Null union 类型(如 Flow Typing 和 Equality)进行了额外的类型改进。
它的工作方式是编译器生成 ,Null
的子类型Any
,而不是AnyRef
像以前那样强制编译时检查。但由于 JVM 的实现方式,擦除后Null
成为所有引用类型的子类型。
新的层次结构:
擦除后:
Scala 中的常规实践只是不使用null
并假设您有行为良好的开发人员做同样的事情。使用Option
来代替。在外围,如果您不信任库/模块/等的用户,您可以使用require
.