2016-11-04 4 views
1

У меня есть два конкретных классов, как это -Scala: классы случае преобразуется в объект

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 $, который обычно обозначает «объект».

Кто это делает и почему? В чем причина такого странного поведения?

ответ

6

Ваш лучший выбор GetList a case object вместо этого ваш новый код будет выглядеть как case object GetList, и таким образом вам не нужно беспокоиться о пустых круглых скобках. Другое дело, что пустые классы классов тоже устарели.

+0

Спасибо. Кроме того, мне пришлось изменить мой приемник также, чтобы выглядеть как «случай GetList' вместо' case g: GetList' – anindyaju99

3

Как GetList - это класс case без параметров. Вы должны назвать его как GetList() не GetList

ref ! GetList() 

Меняет ref ! GetList к ref ! GetList()

GetList является соответствующим спутником объектом прецедентного класса GetList. Если вам нужен экземпляр класса case, вы должны сделать GetList()

Остерегайтесь классов case с пустыми конструкторами.

Вместо сделать случай объект

case object GetList 

От версии 2.11.1 лестницы пустых классов случаев являются устаревшими.

1

Там нет преобразования, это просто, как работают тематические классы: когда вы пишете case class GetList(), это эквивалентно

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

(с некоторыми методами определяется автоматически внутри { ... }).

Так ref ! GetList посылает значениеGetList, который не является экземпляром класса GetList. И case g: GetList преуспевает, когда получает экземпляр класса.