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