No, there are differences.
class A[T] { var x: T }
declares an abstract field. So it doesn’t compile because A
needs to be abstract
.
class A[T] { var x: T = null }
doesn’t compile either, because null
has type Null
which is not a subtype of T
. You could rewrite it as
class A[T] { var x: T = null.asInstanceOf[T] }
which would then almost be equivalent to var x: T = _
, except that there is a reassignment to null
after the call to the super constructor, whereas there is no such reassignment in var x: T = _
. This is observable in contrived examples:
abstract class Base {
init()
def init(): Unit
}
class A[T](someT: T) extends Base {
var x: T = _
val y: T = x
def init(): Unit = x = someT
}
val a = new A[String]("foo")
println(a.y)
this displays foo
. But if you use
var x: T = null.asInstanceOf[T]
it will display null