2013-04-06 55 views
0

此代碼:斯卡拉類型約束令人困惑的錯誤

trait Base[+K <: Option[Int]] { 
    val a: K = None 
} 

class GuaranteedA extends Base[Some[Int]] { 
    override val a = Some(1) 
} 

產生一個錯誤:

<console>:8: error: type mismatch; 
found : None.type 
required: K 
      val a: K = None 

但是,爲什麼? K中的類型約束條件爲K必須是Option[Int]的子類型,即None即使當我嘗試在Base中嘗試val a: K = Some(0)時,也會產生相同的錯誤。

我很困惑這種行爲,不知道爲什麼會發生這種情況,也許你可以幫助我?

回答

4

trait Base[K <: Option[Int]]只是說:有一種類型K它是Option[Int]的子類型。你的第二部分GaranteedA顯示了爲什麼你的Base定義不能假裝NoneK的子類型 - 想象你做不是覆蓋val a。你最終會將價值None轉換爲Some

只是因爲KOption[Int]None亞型是Option[Int]一個亞型,並不能保證NoneK一個亞型。