我有两个这样的案例类 -
case class GetList()
case class Add(num: Int)
我有一个演员,其接收方法如下所示 -
override def receive() = {
case a: Add => // do something
case g: GetList => // do something
case x: Any => // something
}
我将演员称为 -
ref ! Add(1)
ref ! GetList
对于Add(1)消息,我收到了点击:添加接收。但是对于GetList消息,它将转到x:Any。 仔细观察后,我发现我得到的实例是GetList $类型,通常表示“对象”。
谁在进行此转换?为什么?这种奇怪的行为背后的理由是什么?
答案 0 :(得分:6)
最好让GetList
改为case object
,以便您的新代码看起来像case object GetList
,这样您就不必担心空括号。另外需要注意的是,空案例类也已被弃用。
答案 1 :(得分:3)
由于GetList是没有参数的case类。您必须将其称为GetList()
而不是GetList
ref ! GetList()
所以将ref ! GetList
更改为ref ! GetList()
GetList
是案例类GetList
的对应伴随对象。如果您想要案例类的实例,则必须执行GetList()
请注意具有空构造函数的case类。
改为创建案例对象
case object GetList
从scala版本2.11.1开始,不推荐使用空案例类。
答案 2 :(得分:1)
没有转换,只是案例类的工作原理:当你写session.update(object)
时,它等同于
case class GetList()
(在class GetList() { ... }
object GetList { ... }
内自动定义了一些方法)。
因此{ ... }
发送值 ref ! GetList
,它不是类 GetList
的实例。并且GetList
在获得类的实例时会成功。