2013-10-08 49 views
0

我有一個特質和幾個案例類擴展了這個特點。案例類返回產品而不是實際類型

sealed trait Bird 
case class Eagle(age: Int) extends Bird 
case class Sparrow(price: Double) extends Bird 

如果我做了什麼,我會希望返回特質的類型,像

val result = "test" match { 
    case s:String if s startsWith "t" => Eagle(5) 
    case _ => Sparrow(2) 
} 

我得到這個,而不是類型Product

> result: Product with Serializable with Bird = Eagle(5) 

我明白Product是所有案例類擴展的東西。但我不怎麼處理Product,我怎麼能得到Bird甚至Eagle呢?

回答

5

你可以忽略你不關心的方面。 result a Bird,所以用它作爲一個。這也是ProductSerializable是不相關的(除非你想/需要它)。你可以把它明確通過指定其預期的類型:

val result: Bird = "test" match { 
    case s:String if s startsWith "t" => Eagle(5) 
    case _ => Sparrow(2) 
} 

給出:

result: Bird = Eagle(5) 

或者,你可以把它分配給Bird類型的另一個變量,或者只是希望它是一個Bird和充電調用Bird特徵上定義的方法,將其作爲參數傳遞給參數類型爲Bird的函數等。

相關問題