假设我有一个未初始化的 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/