Как получить общее событие в актере - PullRequest
0 голосов
/ 22 января 2019

Я попытался написать универсальный актер, и он может получить универсальное событие

case class CreateEvent[T](t: T)

trait MyBaseActor[Type] extends Actor {
    override def receive: Receive = {
      case CreateEvent(t: Type) => ....
    }
}

Затем я создаю реального актера

case class HasName(name: String)

class MyActor extends MyBaseActor[HasName]

И я ожидаю, что MyActor может обработать сообщениеCreate(HasName("hello") также.Но когда я компилирую код, я получил это предупреждение:

abstract type pattern Type is unchecked since it is eliminated by erasure

И мой актер также не может получить CreateEvent.Может быть, я недостаточно разбираюсь в Generic in scala, пожалуйста, помогите мне объяснить, почему он не работает и как я могу это исправить

1 Ответ

0 голосов
/ 22 января 2019

Не работает из-за стирания типа.Во время выполнения любой экземпляр CreateEvent имеет тип CreateEvent[Object], поэтому вы не можете сопоставить его универсальный тип.

Чтобы обойти его, вы можете использовать ClassTag:

trait MyBaseActor[Type] extends Actor {
  val classTag: ClassTag[Type]

  override def receive: Receive = {
    case CreateEvent(t) if classTag.runtimeClass.isInstance(t) =>
      val typedT: Type = t.asInstanceOf[Type]
      ....
  }
}
class MyActor() extends MyBaseActor[HasName] {
  override final val classTag: ClassTag[HasName] = implicitly[ClassTag[HasName]]
}
...