2010-12-13 70 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

相關問題