通用模式匹配和类型擦除

时间:2017-06-20 21:55:45

标签: scala generics types pattern-matching

目标是编写创建者函数,定义演员可以接收哪种消息,并在actor中匹配这种消息。 所以我想指定我的预期消息是X类型(我只知道这种类型,当我调用create function时)

我的代码非常简单:

import akka.actor.Actor.Receive

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

此代码给出了以下错误:"抽象类型模式X未选中,因为它已被删除"

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

1 个答案:

答案 0 :(得分:1)

ClassTag几乎可以解决这个问题:

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

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