Я думаю, что речь идет о ковариации, но я слаба по теме ...
У меня есть универсальный класс Event, используемый для таких вещей, как постоянство базы данных, скажем так:
class Event(
subject: Long,
verb: String,
directobject: Option[Long],
indirectobject: Option[Long],
timestamp: Long)
{
def getSubject = subject
def getVerb = verb
def getDirectObject = directobject
def getIndirectObject = indirectobject
def getTimestamp = timestamp
}
Однако у меня много разных глаголов событий, и я хочу использовать сопоставление с образцом и тому подобное с этими различными типами событий, поэтому я создам несколько соответствующих классов дел:
trait EventCC
case class Login(user: Long, timestamp: Long) extends EventCC
case class Follow(
follower: Long,
followee: Long,
timestamp: Long
) extends EventCC
Теперь вопросКак я могу легко преобразовать общие События в конкретные классы дел.
Это мой первый удар по этому вопросу:
def event2CC[T <: EventCC](event: Event): T = event.getVerb match {
case "login" => Login(event.getSubject, event.getTimestamp)
case "follow" => Follow(
event.getSubject,
event.getDirectObject.getOrElse(0),
event.getTimestamp
)
// ...
}
К сожалению, это неправильно.
<console>:11: error: type mismatch;
found : Login
required: T
case "login" => Login(event.getSubject, event.getTimestamp)
^
<console>:12: error: type mismatch;
found : Follow
required: T
case "follow" => Follow(event.getSubject,
event.getDirectObject.getOrElse(0), event.getTimestamp)
Может ли кто-нибудь с большим типом фу, чем я, объяснить, если: 1) если то, что я хочу сделать, возможно (или разумно, если на то пошло), и 2) если так, как исправить event2CC
.Спасибо!