Scala:案例类转换为对象

时间:2016-11-04 19:03:30

标签: scala akka

我有两个这样的案例类 -

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 $类型,通常表示“对象”。

谁在进行此转换?为什么?这种奇怪的行为背后的理由是什么?

3 个答案:

答案 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在获得类的实例时会成功。