2010-12-13 68 views
3
trait Link[This] { 
    var next:This = null 
} 

使“类型不匹配;实测值:空(NULL)要求:这个”类型必须被限制为什么才能被赋值为“null”?

所以想必我需要告诉类型检查,这将是可以赋值为null类型。我该怎么做呢?

(如果有一个网站,我应该先读问这样的问题之前,请点我吧。我目前通过第二版的程序的预印本在斯卡拉部分路)

回答

8

您必须将This约束为Null的超类 - 这是告诉编译器null是该类型的有效值的方式。 (事实上​​,想着AnyAnyRefAnyVal仅muddles的问题 - 只要让编译器为你想要的!)

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

不过,我建议您不要使用null,你可以使用Option[This]和影响None - 这样的结构将允许您使用模式匹配,并且是一个非常强烈的声明,即使用此字段的客户应该预期它可能没有价值。

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

完全正确的选项,它最终会这样。但是,这是重构最初在Java中的一些代码的一个步骤,现在有太多的null使用 – 2010-12-13 18:13:47

0
trait Link { 
    var next:This = null 
} 

这应该工作。是否有一个特定的原因,你想需要参数化类型的特质?

+0

是否有一个特定的原因,您认为'Link'类只与他写的片段一样复杂? – 2010-12-13 18:01:56

+0

是的,有一个原因 - 这是混合到另一个类,我正在构造该类的链表。 – 2010-12-13 18:12:56

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] 
} 

跟投,你不再需要绑定此特征编译类型,虽然你可能希望它有其他原因。

+0

我认为原因是“扩展AnyRef'”和“接受'null'作为一个值”在逻辑上是截然不同的 - 人们可以看到这样一个事实,即JVM中每个当前可能的类型都满足或拒绝这两个实现细节。 – 2010-12-13 18:22:04

+1

它没有工作,因为有一种想法,即AnyRef的某些类可能被强制为非空。所以你需要'特性链接[This>:Null <:AnyRef]'。但AnyVal中没有任何内容是'Null'的超类,所以'Link [This>:Null]'就足够了。 – 2010-12-13 18:23:25

相关问题