scala - 如何在 Actor 中接收通用事件
问题描述
我尝试编写一个通用 Actor,它可以接收通用事件
case class CreateEvent[T](t: T)
trait MyBaseActor[Type] extends Actor {
override def receive: Receive = {
case CreateEvent(t: Type) => ....
}
}
然后,我创造了一个真正的演员
case class HasName(name: String)
class MyActor extends MyBaseActor[HasName]
我希望MyActor
也可以处理消息Create(HasName("hello")
。但是当我编译代码时,我收到了这个警告:
abstract type pattern Type is unchecked since it is eliminated by erasure
我的演员也收不到CreateEvent
。也许我对scala中的Generic不够了解,请帮我解释为什么它不起作用以及如何解决它
解决方案
由于类型擦除,它不起作用。在运行时,任何实例CreateEvent
都有类型CreateEvent[Object]
,因此您无法匹配其泛型类型。
要解决它,您可以使用ClassTag
:
trait MyBaseActor[Type] extends Actor {
val classTag: ClassTag[Type]
override def receive: Receive = {
case CreateEvent(t) if classTag.runtimeClass.isInstance(t) =>
val typedT: Type = t.asInstanceOf[Type]
....
}
}
class MyActor() extends MyBaseActor[HasName] {
override final val classTag: ClassTag[HasName] = implicitly[ClassTag[HasName]]
}
推荐阅读
- swiftui - 重命名模式表上的取消按钮
- r - 将每一行除以R中的前一行
- active-directory - 我希望迁移 adb2c,但旧广告使用由 userflow 实现的 mfa。如何获得strongAuthenticationPhoneNumber?
- c# - 为什么在使用数据模板时视图的数据上下文是视图模型?
- kubernetes - 在 Ingress-Nginx 上接收请求后,如何使用 Keycloak(用于身份验证/授权)作为中间件?
- javascript - 使用动态 html 表格的内容
- r - 如何根据向量元素在列表中的位置替换它们?
- psycopg2 - 我正在尝试在我的 Mac 上安装 django-heroku,但出现以下错误
- swift - LPMetadataProvider/LinkPresentation:如何在 Slack/WhatsApp 上使用自定义图像/图标,...?
- swiftui - SwiftUI iOS14 GeometryReader 框架尺寸无效