2013-10-08 50 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的函数等。

相关问题