2013-07-31 39 views
1

這裏是一個代碼,涉及阿卡:非可變型參數akka.actor.ActorRef

def receive = { 
    case idList: List[ActorRef] => idList.foreach(x => x ! Msg) 
} 

SBT抱怨說:

non-variable type argument akka.actor.ActorRef in type pattern List[akka.actor.ActorRef] is unchecked since it is eliminated by erasure 
[warn]  case idList: List[ActorRef] => idList.foreach(x => x ! Msg) 

如何擺脫呢?

回答

6

在運行時間List[Whatever]相當於List[Any],所以您的演員可以找出它收到一個列表,但不是它是一個列表ActorRef s。這是一個JVM的事情,而不是Scala或Akka的錯。

你有兩個選擇:

1)通過與_

case idList: List[_] => ... 

2)把它包更換ActorRef到數據結構(推薦)

case class Ids(idList: List[ActorRef]) 

第二個選擇我們忽略它的您無需檢查列表的參數類型就可以檢查ID。

def receive = { 
    case Ids(idList) => idList.foreach(x => x ! Msg) 
} 
+0

的第一選擇將無法編譯,會嗎? –

+0

@MariusKavansky,我懷疑第一解決方案將編譯,因爲你將不能夠做到這一點任何更多:'idList.foreach(X => X消息!)',因爲它不再知道'x'是' ActorRef'。更多的理由去與解決方案2. – cmbaxter

+0

,我已經寫了肯定會編譯一部分;),但我已經離開了不會,除非你做強制轉換爲'ActorRef'的部分。對不起,我還沒有做出明確(沒有時間澄清)。這應該是顯而易見的,雖然,這類型轉換告訴你不關心正確性類型系統的原因,特別是存在的;) – agilesteel