trait Base[B] { def data: AnyRef; } class Suba[@specialized B](override val data: Array[B]) extends Base[B] { assert(data != null) } class Subopt[@specialized B](override val data: Option[B]) extends Base[B] { assert(data != null) } object Test { def main(args: Array[String]): Unit = { val ss = new Suba[String](Array("")) val si = new Suba[Int](Array(0)) new Subopt[Int](Some(0)) } }