2016-11-04 195 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獲得該類的實例時成功。