Как написать метод, который принимает параметр с ковариантной или контравариантной границей в scala?

Я пишу программу Scala, которая в какой-то момент должна обеспечивать обновление статуса для некоторой задачи, и она могла бы предоставлять ее также для групп задач. Дело в том, что в разных phaseс, детали разные. Так что на самом деле существуют различные реализации для Details черта, которую я здесь не включил.

case class GroupMessage [+S <: Details]
(
  id: String,
  statuses: List[StatusMessage[S]]
) 

case class StatusMessage [+S <: Details]
(
  id: String,
  phase: Phase,
  statusDetails: S
)

sealed trait Details {
  def getDetails: List[String]
}

Теперь проблема заключается в методе, который получает обновления этого статуса, и я не могу получить правильную подпись. Если я просто поставлю def receiveStatus(status: StatusMessage) компилятор жалуется, что StatusMessage принимает параметры типа. Я думал, что мне нужно что-то вроде def receiveStatus[S :> Details](status: StatusMessage[S]) но это тоже не компилируется.

1 ответ

Решение

Символ :> не существует - вы, вероятно, хотели использовать >:,

Но это все равно не скомпилируется, потому что вы хотите S быть подтипом Details (например SpecialDetailsне супертип (например, Any).

def receiveStatus[S <: Details](status: StatusMessage[S])
Другие вопросы по тегам