2016-11-04 217 views
1

我有两个case类像这样的 -斯卡拉:case类转换为对象

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 

对于添加(1)消息,我得到一个一击:在添加接收。但是,对于GetList消息,它将发送到x:Any。 仔细观察我发现我得到的实例是GetList $类型,它通常表示一个“对象”。

谁在做这种转换,为什么?这种怪异行为的基本原理是什么?

回答

6

您最好使GetList a case object代替,以便您的新代码看起来像case object GetList,这样您就不必担心空括号。另一件需要注意的是,空的案例类也被弃用。

+0

谢谢。另外,我必须更改我的接收匹配器,使其看起来像'case GetList',而不是'case g:GetList' – anindyaju99

3

由于GetList是没有参数的case类。你要称呼其为GetList()GetList

ref ! GetList() 

因此改变ref ! GetListref ! GetList()

GetList是这样的类GetList对应的同伴对象。如果你想要案例类的实例,你必须做GetList()

请注意带空构造函数的case类。

反而使情况对象

case object GetList 

从斯卡拉版本2.11.1空的情况下,类弃用。

1

没有转换,它的case类是如何工作的:当你写case class GetList(),这相当于

class GetList() { ... } 
object GetList { ... } 

(有一些方法里面{ ... }自动定义)。

所以ref ! GetList发送GetList,这是不GetList的类的一个实例。当case g: GetList获得该类的实例时成功。