Правильно ли расхождения с актерами Акки?
Я часто сталкиваюсь со следующей проблемой при использовании дженериков и актеров 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] {
// ...
}