Правильно ли расхождения с актерами Акки?

Я часто сталкиваюсь со следующей проблемой при использовании дженериков и актеров Akka:

trait AuctionParticipantActor[P <: AuctionParticipant[P]]
  extends StackableActor {


  override def receive: Receive = {
    case message: Handled =>
      participant = participant.handle(message)
      super.receive(message)
    case message =>
      super.receive(message)
  }

  protected var participant: P

}

AuctionParticipantActor это просто обертка вокруг неизменного AuctionParticipant, Мне нужно что то типа P является ковариантным, и я не уверен, что это лучший способ достичь этого.

В качестве альтернативы, для моих случаев использования я не думаю, что мне даже нужно параметризовать AuctionParticipantActor, Я мог бы иметь что-то вроде:

trait AuctionParticipantActor
  extends StackableActor {


  override def receive: Receive = {
    case message: Handled =>
      participant = participant.handle(message)
      super.receive(message)
    case message =>
      super.receive(message)
  }

  protected var participant: AuctionParticipant[???]

}

Но в этом случае я не уверен, что поставить вместо??? для того, чтобы соблюдать ограничения типа. Если кто-то думает, что моя проблема с дизайном, пожалуйста, так и скажите. Мысли?

1 ответ

Если вы не используете f-bounded-полиморфизм, зачем вам AuctionParticipant быть родовым? Что означает параметр типа P в AuctionParticipant[P] затем? Если, как вы сказали, AuctionParticipantActor это просто обертка над AuctionParticipant и если AuctionParticipantActor больше не является общим, то, возможно, AuctionParticipant тоже не должно быть

trait AuctionParticipantActor
  extends StackableActor {


  override def receive: Receive = {
    case message: Handled =>
      participant = participant.handle(message)
      super.receive(message)
    case message =>
      super.receive(message)
  }

  protected var participant: AuctionParticipant

}

trait AuctionParticipant {
  // ...
}

В противном случае, если AuctionParticipant все еще должен быть общим (то есть есть какое-то другое значение P) тогда, возможно, вы можете использовать экзистенциальный тип:

trait AuctionParticipantActor
  extends StackableActor {


  override def receive: Receive = {
    case message: Handled =>
      participant = participant.handle(message)
      super.receive(message)
    case message =>
      super.receive(message)
  }

  protected var participant: AuctionParticipant[_]

}

trait AuctionParticipant[P] {
  // ...
}
Другие вопросы по тегам