Scala 泛型类型上的Akka模式匹配

Scala 泛型类型上的Akka模式匹配,scala,generics,apache-kafka,akka,akka-stream,Scala,Generics,Apache Kafka,Akka,Akka Stream,我有一个Actor实例,定义如下: class KafkaPublisher[T <: KafkaMessage] extends Actor { override final def receive = { case ProducerStreamActivated(_, stream: SourceQueueWithComplete[T]) => context.become(active(stream)) case other => pr

我有一个Actor实例,定义如下:

class KafkaPublisher[T <: KafkaMessage] extends Actor {

  override final def receive = {
    case ProducerStreamActivated(_, stream: SourceQueueWithComplete[T]) =>
      context.become(active(stream))

    case other => println("KafkaPublisher got some unknown message while producing: " + other)
  }

  def active(stream: SourceQueueWithComplete[T]): Receive = super.receive orElse {
    case msg: T =>
      stream.offer(msg)

    case other => println("KafkaPublisher got the unknown message while producing: " + other)
  }
}
object KafkaPublisher {

  def props[T <: KafkaMessage](implicit tag: ClassTag[T]) = Props(new KafkaPublisher[T])
}
def actorFor(props: Props, actorName: String) = context.actorOf(props, actorName)
val actorRef = actorFor(KafkaPublisher.props[MeterData], "meter-data-actor")
因此,在我的SupervisorActor中,我创建了一个PublisherActor实例,如下所示:

class KafkaPublisher[T <: KafkaMessage] extends Actor {

  override final def receive = {
    case ProducerStreamActivated(_, stream: SourceQueueWithComplete[T]) =>
      context.become(active(stream))

    case other => println("KafkaPublisher got some unknown message while producing: " + other)
  }

  def active(stream: SourceQueueWithComplete[T]): Receive = super.receive orElse {
    case msg: T =>
      stream.offer(msg)

    case other => println("KafkaPublisher got the unknown message while producing: " + other)
  }
}
object KafkaPublisher {

  def props[T <: KafkaMessage](implicit tag: ClassTag[T]) = Props(new KafkaPublisher[T])
}
def actorFor(props: Props, actorName: String) = context.actorOf(props, actorName)
val actorRef = actorFor(KafkaPublisher.props[MeterData], "meter-data-actor")
类似地,我为给定的KafkaMessage类型创建了相应的Akka流


所以我的问题是,如果我定义了一个通用的模式匹配,那么这个KafkaPublisher参与者模式会匹配MeterData吗。我的props方法中的类标记是否足以让我通过类型擦除?建议?

当作用域中存在隐式
类标记[T]
时,泛型类型
T
上的模式匹配应该有效。因此,在您的
kafkapulisher
中提供并存储
ClassTag
就足够了:

import scala.reflect.ClassTag

class KafkaPublisher[T <: KafkaMessage : ClassTag] {
  /* ... */
}

object KafkaPublisher {
  def props[T <: KafkaMessage : ClassTag] = Props(new KafkaPublisher[T])
}
导入scala.reflect.ClassTag

当作用域中存在隐式
ClassTag[T]
时,泛型类型
T
上的类KafkaPublisher[T模式匹配应该可以工作。因此,在
KafkaPublisher
中提供并存储
ClassTag
就足够了:

import scala.reflect.ClassTag

class KafkaPublisher[T <: KafkaMessage : ClassTag] {
  /* ... */
}

object KafkaPublisher {
  def props[T <: KafkaMessage : ClassTag] = Props(new KafkaPublisher[T])
}
导入scala.reflect.ClassTag

卡夫卡出版类[T如果您需要更多嵌套类型的类型信息,还可以使用TypeTag。如果您对有关ClassTag和TypeTag的更多信息感兴趣,我强烈建议您阅读。如果您需要更多嵌套类型的类型信息,还可以使用TypeTag。如果您对有关ClassTag的更多信息感兴趣,我强烈建议您阅读和类型标签。