为什么这不起作用?
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
null
是 type 的值Null
,但不是任何类型都有Null
子类型,只有 -AnyRef
派生的(Nothing
当然,除了 )。假设你做了类似的事情
object SomeObj extends testtrait[Int]
SomeObj.ob
应该等于什么?它是Int
,因此它没有null
作为可能的值。
正如在其他答案中所说,您应该使用下划线语法来设置类型的默认值。
我不能确切地说为什么,但是下划线概念(这是类型默认值的快捷方式,对于 objects 是 null)可以正常工作:
trait testtrait[T] {
var ob:T = _
}
铸造了更可怕的解决方法asInstanceOf
,但我发现下划线更好的选择。
trait testtrait[T] {
var ob:T = null.asInstanceOf[T]
}
所有类型的底部类型是Nothing
. 这意味着任何类型T
,不受其他约束,都可以是Nothing
,并且null
不是 a Nothing
(实际上,没有值是)。
因此,为了能够分配null
,您必须编写它[T >: Null]
(T
是 的超类型Null
)。
另一方面,您可以使用 将其初始化为默认值var ob: T = _
。但是,请注意,对于任何AnyVal
,T
将被装箱并分配null
而不是 0,这可能会导致意外结果。