Scala 类型在分配之前必须约束到什么;空“;?

Scala 类型在分配之前必须约束到什么;空“;?,scala,types,null,scala-2.8,Scala,Types,Null,Scala 2.8,给出“类型不匹配;找到:Null(Null)必需:此” 所以我大概需要告诉类型检查器,这将是一个可以赋值为null的类型。我该怎么做 (如果有一个网站我应该先阅读,然后再问这样的问题,请告诉我。我目前正在部分阅读Scala编程第二版的预印本) 这应该行得通。是否有特定的原因需要使用类型参数化trait?我的第一个想法不起作用。我不知道为什么 trait Link { var next:This = null } trait Link[This您必须将This约束为Null的超类-这是告诉编

给出“类型不匹配;找到:Null(Null)必需:此”

所以我大概需要告诉类型检查器,这将是一个可以赋值为null的类型。我该怎么做

(如果有一个网站我应该先阅读,然后再问这样的问题,请告诉我。我目前正在部分阅读Scala编程第二版的预印本)


这应该行得通。是否有特定的原因需要使用类型参数化trait?

我的第一个想法不起作用。我不知道为什么

trait Link {
  var next:This = null
}

trait Link[This您必须将
This
约束为
Null
的超类-这是告诉编译器
Null
是该类型的有效值的一种方式。(事实上,考虑
Any
AnyRef
AnyVal
只会把问题弄糊涂——只要问问编译器你想要什么就行了!)

但是,我建议您避免使用
null
,您可以使用
选项[This]
并影响
None
——这样的构造将允许您使用模式匹配,这是一个非常有力的声明,使用此字段的客户应该期望它可能没有价值

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

你认为
链接
类只和他写的代码片段一样复杂,这有什么特别的原因吗?是的,这是有原因的-这是混合在另一个类中的,我正在构建该类的链接列表。这个选项非常正确,最终会这样做。但这是重构一些原始代码的一个步骤在Java中,null有太多的用法,我认为原因是“扩展
AnyRef
”和“接受
null
作为值”逻辑上是不同的-我们可以看到,JVM中当前可能的每种类型都满足或拒绝这两种类型,这是一个实现细节。它不起作用,因为有一种想法是,
AnyRef
的某些类可能被强制为非空。因此,您需要
trait链接[This>:null:null]
就足够了。
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]
}
trait Link[This >: Null] {
  var next:This = null
}
trait Link[This] {
  var next:Option[This] = None
}