Scala 泛型模式匹配与类型擦除

Scala 泛型模式匹配与类型擦除,scala,generics,types,pattern-matching,Scala,Generics,Types,Pattern Matching,目标是编写creator函数,定义参与者可以接收的消息类型,并在参与者内部匹配此类消息。 所以我想指定我期望的消息是X类型的,只有在调用create函数时我才知道这种类型 我有非常简单的代码: import akka.actor.Actor.Receive def create[X]():Receive = { case msg:X => } 这段代码给了我以下错误:抽象类型模式X被取消选中,因为它是通过擦除消除的 我知道什么是类型擦除,但我找不到解决这个问题的任何方法。类标记可以

目标是编写creator函数,定义参与者可以接收的消息类型,并在参与者内部匹配此类消息。 所以我想指定我期望的消息是X类型的,只有在调用create函数时我才知道这种类型

我有非常简单的代码:

import akka.actor.Actor.Receive

def create[X]():Receive = {
  case msg:X =>
}
这段代码给了我以下错误:抽象类型模式X被取消选中,因为它是通过擦除消除的


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

类标记可以很好地处理这个问题:

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

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

你看到了吗?只需定义create[X:ClassTag]:Receive={case msg:X=>}就可以了谢谢你,这正是我要搜索的