它得到扩展时是否是特性的一部分?

时间:2019-07-15 11:33:32

标签: scala

我有以下代码:

object ServerStreamer {

  sealed trait Ack

  object Ack extends Ack

  sealed trait ServerHealthStreamer

  case class Init(ackTo: ActorRef[Ack]) extends ServerHealthStreamer

  case object Complete extends ServerHealthStreamer

  case class Fail(ex: Throwable) extends ServerHealthStreamer

  sealed trait SapHealthStreamer extends ServerHealthStreamer

  case class SapMessage(ackTo: ActorRef[Ack], msg: SapHealthEvent) extends SapHealthStreamer

  sealed trait KafkaHealthStreamer extends ServerHealthStreamer

  case class KafkaMessage(ackTo: ActorRef[Ack], msg: KafkaHealthEvent) extends KafkaHealthStreamer

}

我想知道,例如CompleteSapHealthStreamer的一种类型,我可以将其用于模式匹配。

对于实例,模式匹配如下所示:

val value: SapHealthStreamer = Complete


value match {
   case Init =>
    ???
   case Complete =>
    ??? 
   case Fail =>
    ???     
   case d:SapMessage =>
    ???    
}

1 个答案:

答案 0 :(得分:2)

  

完成是SapHealthStreamer的一种

不是,它是ServerHealthStreamer类型的值(但不是SapHealthStreamer类型的值)

  

对于实例,模式匹配如下所示:

由于类型不兼容,第一行将无法编译。假设您的意思是

val value: ServerHealthStreamer = Complete

相反,是的,您可以像这样匹配Complete。问题出在case Initcase Fail上,它们将匹配其伴随对象而不是类型,而这可能不是您想要的(您会收到一条错误消息,因为这些伴随对象的类型与{{1}不兼容,因此永远无法匹配)。

value