Scala 泛型类型上的Akka模式匹配
我有一个Actor实例,定义如下: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
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的更多信息感兴趣,我强烈建议您阅读和类型标签。