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