trait Link[This] {
var next:This = null
}
使“类型不匹配;实测值:空(NULL)要求:这个”类型必须被限制为什么才能被赋值为“null”?
所以想必我需要告诉类型检查,这将是可以赋值为null类型。我该怎么做呢?
(如果有一个网站,我应该先读问这样的问题之前,请点我吧。我目前通过第二版的程序的预印本在斯卡拉部分路)
trait Link[This] {
var next:This = null
}
使“类型不匹配;实测值:空(NULL)要求:这个”类型必须被限制为什么才能被赋值为“null”?
所以想必我需要告诉类型检查,这将是可以赋值为null类型。我该怎么做呢?
(如果有一个网站,我应该先读问这样的问题之前,请点我吧。我目前通过第二版的程序的预印本在斯卡拉部分路)
您必须将This
约束为Null
的超类 - 这是告诉编译器null
是该类型的有效值的方式。 (事实上,想着Any
,AnyRef
和AnyVal
仅muddles的问题 - 只要让编译器为你想要的!)
trait Link[This >: Null] {
var next:This = null
}
不过,我建议您不要使用null
,你可以使用Option[This]
和影响None
- 这样的结构将允许您使用模式匹配,并且是一个非常强烈的声明,即使用此字段的客户应该预期它可能没有价值。
trait Link[This] {
var next:Option[This] = None
}
trait Link {
var next:This = null
}
这应该工作。是否有一个特定的原因,你想需要参数化类型的特质?
是否有一个特定的原因,您认为'Link'类只与他写的片段一样复杂? – 2010-12-13 18:01:56
是的,有一个原因 - 这是混合到另一个类,我正在构造该类的链表。 – 2010-12-13 18:12:56
我的第一个想法,哪个没有奏效。我不知道为什么。
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]
}
跟投,你不再需要绑定此特征编译类型,虽然你可能希望它有其他原因。
我认为原因是“扩展AnyRef'”和“接受'null'作为一个值”在逻辑上是截然不同的 - 人们可以看到这样一个事实,即JVM中每个当前可能的类型都满足或拒绝这两个实现细节。 – 2010-12-13 18:22:04
它没有工作,因为有一种想法,即AnyRef的某些类可能被强制为非空。所以你需要'特性链接[This>:Null <:AnyRef]'。但AnyVal中没有任何内容是'Null'的超类,所以'Link [This>:Null]'就足够了。 – 2010-12-13 18:23:25
完全正确的选项,它最终会这样。但是,这是重构最初在Java中的一些代码的一个步骤,现在有太多的null使用 – 2010-12-13 18:13:47