Alternatives
Use null
as a last resort. As already mentioned, Option
replaces most usages of null. If you using null
to implement deferred initialisation of a field with some expensive calculation, you should use a lazy val
.
Canonical initialisation to null
That said, Scala does support null
. I personally use it in combination with Spring Dependency Injection.
Your code is perfectly valid. However, I suggest that you use var t: T = _
to initialize t
to it's default value. If T
is a primitive, you get the default specific to the type. Otherwise you get null
.
Not only is this more concise, but it is necessary when you don't know in advance what T
will be:
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
Advanced
Using var t: T= null
is a compile error if T is unbounded:
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 }
You can add an implicit parameter as evidence that T
is nullable -- a subtype of AnyRef
not a subtype of NotNull
This isn't fully baked, even in Scala 2.8, so just consider it a curiousity for now.
scala> class A[T](implicit ev: Null <:< T) { var t: T = null } defined class A
参考链接:
https://*.com/questions/2440134/is-this-the-proper-way-to-initialize-null-references-in-scala