Альтернативы
Используйте null
как последнее средство. Как уже упоминалось, Option
заменяет большинство случаев использования null. Если вы используете null
для реализации отложенной инициализации поля с некоторыми дорогостоящими вычислениями, вы должны использовать lazy val
.
Каноническая инициализация к нулю
Тем не менее, Scala поддерживает null
. Я лично использую его в сочетании с Spring Dependency Injection.
Ваш код действителен. Тем не менее, я предлагаю вам использовать 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
Advanced
Использование var t: T= null
является ошибкой компиляции, если T неограничен:
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
Это не полностью запеченный , даже в Scala 2.8, так что пока просто посчитайте это любопытным.
scala> class A[T](implicit ev: Null <:< T) { var t: T = null }
defined class A