case类返回Product而不是实际类型

时间:2013-10-08 11:33:31

标签: scala case-class

我有一个特质和一些案例类来扩展这个特性。

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

如果我做任何我希望将Trait作为类型返回的内容,例如

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回来?

1 个答案:

答案 0 :(得分:5)

您可以忽略您不关心的方面。 result 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等参数的函数的参数