scala - 这是在 Scala 中初始化空引用的正确方法吗?

标签 scala null

假设我有一个未初始化的 MyObject 实例:

var a:MyObject = null

这是将其初始化为 null 的正确方法吗?

最佳答案

替代方案

使用null作为最后的手段。正如已经提到的,Option 取代了 null 的大部分用法。如果您使用 null 来实现字段的延迟初始化并进行一些昂贵的计算,则应该使用 lazy val

规范初始化为 null

也就是说,Scala 确实支持 null。我个人将它与 Spring 依赖注入(inject)结合使用。

您的代码完全有效。不过,我建议您使用 var t: T = _t 初始化为其默认值。如果 T 是原语,您将获得特定于该类型的默认值。否则你会得到null

这不仅更简洁,而且当您事先不知道 T 是什么时,这是必要的:

scala> class A[T] { var t: T = _ }
defined class A

scala> new A[String].t
res0: String = null

scala> new A[Object].t            
res1: java.lang.Object = null

scala> new A[Int].t   
res2: Int = 0

scala> new A[Byte].t
res3: Byte = 0

scala> new A[Boolean].t
res4: Boolean = false

scala> new A[Any].t   
res5: Any = null

高级

如果 T 是无界的,则使用 var t: T= null 会出现编译错误:

scala> class A[T] { var t: T = null }
<console>:5: error: type mismatch;
 found   : Null(null)
 required: T
       class A[T] { var t: T = null }

您可以添加一个隐式参数作为 T 可为空的证据 - AnyRef 的子类型而不是 NotNull 这不是'完全baked ,即使在 Scala 2.8 中,所以现在只是将其视为好奇。

scala> class A[T](implicit ev: Null <:< T) { var t: T = null }           
defined class A

关于scala - 这是在 Scala 中初始化空引用的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440134/

相关文章:

scala - 一个简单的 Scala Web 框架?

scala - 卡夫卡流0.10.1 "Failed to flush state store"

具有空键的 Java 不区分大小写的映射

sql - 如何将所有记录的空白(null)值替换为 0?

scala - 在 Scala 中重载泛型方法

list - 反向列表 Scala

Scala关闭 Hook 永远不会运行?

java - 为什么字符串输出中出现空值?

c - 在 C 中取消引用指向不完整类型队列的指针

mysql - 在 MySQL 5.7 中,我们可以在包含 NULL 值的列上创建索引吗?