0

我有一个特征和一些扩展这个特征的案例类。

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返回呢?

4

1 回答 1

5

您可以忽略您不关心的方面。result a Bird,因此将其用作一个。它也是 aProduct并且 aSerializable不相关(除非您想要/需要它)。您可以通过指定其预期类型使其显式:

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

给出:

result: Bird = Eagle(5)

或者,您可以将它分配给另一个 type 变量Bird,或者只是期望它是 aBird并提前充电,调用在Birdtrait 上定义的方法,将其作为参数传递给采用 type 参数的函数Bird等。

于 2013-10-08T11:40:31.970 回答