【问题标题】:Generic pattern matching and type erasure通用模式匹配和类型擦除
【发布时间】:2017-11-23 14:57:28
【问题描述】:

目标是编写creator函数,定义actor可以接收什么样的消息,并在actor内部匹配这种消息。 所以我想指定我的预期消息是 X 类型(我只有在调用 create 函数时才知道这种类型)

我有非常简单的代码:

import akka.actor.Actor.Receive

def create[X]():Receive = {
  case msg:X =>
}

此代码给我以下错误:“抽象类型模式 X 未选中,因为它已被擦除消除”

我知道什么是类型擦除,但我找不到任何解决此问题的方法。

【问题讨论】:

标签: scala generics types pattern-matching


【解决方案1】:

ClassTag 几乎可以处理这个问题:

def create[X](implicit tag: ClassTag[X]): Receive = {
  case msg if msg.getClass == tag.runtimeClass =>
}

请注意,如果您的消息类型本身受到类型擦除的影响,这将失败。例如,create[List[String]] 仍将接受 List[Int]。我认为没有办法解决这个问题,因为该信息在运行时完全消失了。

【讨论】:

  • 只需def create[X : ClassTag]: Receive = { case msg: X => } 也可以使用
  • 谢谢,这正是我正在寻找的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2018-04-12
  • 2015-10-06
  • 1970-01-01
  • 2016-01-24
  • 2015-11-21
  • 1970-01-01
相关资源
最近更新 更多