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