trait Link[This] {
var next:This = null
}
给出“类型不匹配;找到:Null(null)required:this”
所以我可能需要告诉类型检查器,这将是一个可以指定为null的类型。我该怎么做?
(如果在提出这样的问题之前我应该先阅读一个网站,请指点我。我目前已经完成了Scala编程第二版预印本的部分内容)
答案 0 :(得分:8)
您必须将This
约束为Null
的超类 - 这是告诉编译器null
是该类型的有效值的方法。 (事实上,考虑Any
,AnyRef
和AnyVal
只会混淆问题 - 只需向编译器询问您想要的内容!)
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]
}
使用强制转换,您不再需要为此特征绑定的类型进行编译,尽管您可能出于其他原因需要它。