为什么我无法声明用null初始化的参数化类型的变量?

Mic*_*lak 2 generics scala traits

为什么这不起作用?

trait testtrait[T] {
  var ob:T = null
}
Run Code Online (Sandbox Code Playgroud)

然后scalac testtrait.scala产生

testtrait.scala:2: error: type mismatch;
 found   : Null(null)
 required: T
  var ob:T = null
             ^
one error found
Run Code Online (Sandbox Code Playgroud)

我正在使用Scala 2.9

om-*_*nom 5

我不能确切地说为什么,但是下划线的概念(这是类型的默认值的快捷方式,对象为null)将正常工作:

trait testtrait[T] {
  var ob:T = _
}
Run Code Online (Sandbox Code Playgroud)

更多可怕的解决方法已被asInstanceOf投射,但我找到了更好的替代方案.

trait testtrait[T] {
  var ob:T = null.asInstanceOf[T]
}
Run Code Online (Sandbox Code Playgroud)


Vla*_*eev 5

null是一个类型的值Null,但不是任何类型具有Null子类型,只有AnyRef派生的类型(Nothing当然除外).假设你做了类似的事情

object SomeObj extends testtrait[Int]
Run Code Online (Sandbox Code Playgroud)

什么SomeObj.ob应该等于?它是一个Int,所以没有null可能的价值.

正如在其他答案中所说,您应该使用下划线语法来设置类型的默认值.

  • @ om-nom-nom,因为`Nothing <:AnyRef`和`Nothing`没有`null`.`T>:Null <:AnyRef`应该有效.在我的回答中,我想我在这方面略显不正确,我会解决它. (2认同)