Я пытаюсь сделать что-то вроде следующего:
trait MyData
trait MyId
trait MyDataType[T <: MyData] {
type MyIdType <: MyId
// There can be converters here to bring back
// lost type information.
}
trait Writer[T <: MyData] {
def save(data: Map[T#MyIdType, T])
}
val writers: Map[MyDataType[_ <: MyData], Writer[_ <: MyData]]
val data: Map[MyDataType[_ <: MyData], Map[MyId, MyData]]
// mapping from id -> data grouped by the type of data.
// We've now lost the type safety since this is just a big bag.
data.foreach { case (type, map) =>
writer.get(type).save(map)
// DOES NOT COMPILE SINCE IT CAN'T GUARANTEE WRITER AND
// MAP ARE OF SAME TYPE
}
Я хотел бы изменить это на что-то вроде
data.foreach {
case (type: MyDataType[T], map: Map[T#MyIdType, T]) forSome {
type T <: MyData } =>
// do save logic
// COMPILER COMPLAINS - not found: type T
}
, но это не похоже наЯ могу использовать экзистенциальные типы в утверждениях case.Обратите внимание, что в данный момент меня не интересует отсутствие безопасности типов, потому что мои данные уже сгруппированы по типам, поэтому я просто хочу, чтобы компилятор принял тип, через который я проходил.Какие-либо предложения?Я также пытался параметризовать оператор case, но это было бесполезно:
data.foreach {
case [T <: MyData](type: MyDataType[T], map: Map[T#MyIdType, T]) =>
// do save logic
// COMPILER COMPLAINS -
// illegal start of simple pattern for the parameterization
}
Есть идеи, как сделать то, что я хочу?