2013-07-31 3 views
1

Вот код с участием Akka:неизменяемой аргумент типа 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, а не вина Скалы или Акки.

У вас есть два варианта:

1) Ignore, заменив ActorRef с _

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

2) завернуть его в структуру данных (рекомендуется)

case class Ids(idList: List[ActorRef]) 

Второй выбор давайте вы проверяете идентификаторы, не проверяя параметрический тип списка.

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

Первый выбор не будет компилироваться, не так ли? –

+0

@MariusKavansky, я сомневаюсь, что первое решение будет скомпилировано, потому что вы больше не сможете этого сделать: 'idList.foreach (x => x! Msg)', потому что он больше не будет знать, что 'x' является' ActorRef'. Тем более, что нужно пойти с решением 2. – cmbaxter

+0

Часть, которую я написал, обязательно скомпилирует;), но часть, которую я оставил, не будет, если вы не сделаете актерский состав в ActorRef'. Мне жаль, что я не дал понять (не успел пояснить). Это должно быть очевидно, однако, что типы приведения существуют специально для того, чтобы сообщить системе типов, что вы не заботитесь о правильности;) – agilesteel

Смежные вопросы