2017-06-20 66 views
0

目标是编写创建者函数,定义参与者可以接收什么类型的消息,并在演员内部匹配这类消息。 所以我想指定我期望的消息是X型的(我知道这类型只有当我调用创建函数)通用模式匹配和类型擦除

我有非常简单的代码:

import akka.actor.Actor.Receive 

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

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

我知道什么是类型擦除,但我找不到任何解决方案为这个问题。

+0

你见过http://daily-scala.blogspot.ca/2010/01/overcoming-type-erasure-in-matching-1.html吗? –

回答

0

一个ClassTag会非常处理这个问题:

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

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

+3

只需'def create [X:ClassTag]:Receive = {case msg:X => }'也可以工作 – Kolmar

+0

谢谢,这正是我正在寻找的 – Antek