在将类型赋值为“null”之前必须约束什么类型?

时间:2010-12-13 17:29:56

标签: scala types null scala-2.8

trait Link[This] {
    var next:This = null
}

给出“类型不匹配;找到:Null(null)required:this”

所以我可能需要告诉类型检查器,这将是一个可以指定为null的类型。我该怎么做?

(如果在提出这样的问题之前我应该​​先阅读一个网站,请指点我。我目前已经完成了Scala编程第二版预印本的部分内容)

3 个答案:

答案 0 :(得分:8)

您必须将This约束为Null的超类 - 这是告诉编译器null是该类型的有效值的方法。 (事实上​​,考虑AnyAnyRefAnyVal只会混淆问题 - 只需向编译器询问您想要的内容!)

trait Link[This >: Null] {
  var next:This = null
}

但是,我建议您避免使用null,可以使用Option[This]并影响None - 这样的结构可以让您使用模式匹配,并且非常强大使用此字段的客户应该预期它可能没有价值。

trait Link[This] {
  var next:Option[This] = None
}

答案 1 :(得分:0)

trait Link {
  var next:This = null
}

这应该有效。是否有特定原因需要使用类型参数化特征?

答案 2 :(得分:0)

我的第一个想法,哪个没用。我不确定为什么。

trait Link[This <: AnyRef] { // Without the type bound, it's Any
    var next: This = null
}

当情况变得更糟时,总会有人施展:

trait Link[This <: AnyRef] {
    var next: This = null.asInstanceOf[This]
}

使用强制转换,您不再需要为此特征绑定的类型进行编译,尽管您可能出于其他原因需要它。