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

Scala 为什么我';m无法声明初始化为null的参数化类型的变量?,scala,generics,traits,Scala,Generics,Traits,为什么这样不行 trait testtrait[T] { var ob:T = null } 然后scalac testtrait.scala生成 testtrait.scala:2: error: type mismatch; found : Null(null) required: T var ob:T = null ^ one error found 我使用的是Scala 2.9,我说不出确切的原因,但下划线概念(类型默认值的快捷方式,对象为空

为什么这样不行

trait testtrait[T] {
  var ob:T = null
}
然后scalac testtrait.scala生成

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

我使用的是Scala 2.9,我说不出确切的原因,但下划线概念(类型默认值的快捷方式,对象为空)可以正常工作:

trait testtrait[T] {
  var ob:T = _
}
更可怕的解决方法是
asInstanceOf
cast,但我发现下划线是更好的选择

trait testtrait[T] {
  var ob:T = null.asInstanceOf[T]
}

null
是类型
null
的值,但没有任何类型将
null
作为子类型,只有
AnyRef
派生的子类型(当然,
Nothing
除外)。假设你做了类似的事情

object SomeObj extends testtrait[Int]
SomeObj.ob应该等于什么?它是一个
Int
,因此它没有
null
作为可能的值

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

所有类型的底部类型都是
Nothing
。这意味着任何类型
T
,不受其他约束,可以是
Nothing
,并且
null
不是
Nothing
(事实上,没有值)

因此,要分配
null
,您必须编写
[T>:null]
T
null
的超类型)


另一方面,您可以使用
var ob:T=\uu
将其初始化为默认值。但是,请注意,对于任何
AnyVal
T
将被装箱并分配
null
,而不是,例如,0,这可能导致意外结果。

为什么
var
而不是
val
。通常在你不想要的特质上。您需要一个
def
。@wheaties不是真的。您可能有很好的理由想要在trait中使用
val
甚至
var
,但为什么上界类型参数不起作用呢?我的意思是
testtrait[T@om nom nom,因为
Nothing:Null