Je suis en train de faire quelque chose à peu près comme suit:types existentialistes et la correspondance de Scala
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
}
Je voudrais changer cela à quelque chose comme
data.foreach {
case (type: MyDataType[T], map: Map[T#MyIdType, T]) forSome {
type T <: MyData } =>
// do save logic
// COMPILER COMPLAINS - not found: type T
}
mais il n » On dirait que je peux utiliser des types existentiels dans des déclarations de cas. Notez que je ne me soucie pas de la sécurité des types manquants à ce stade parce que mes données sont déjà groupées par type, donc je veux juste un moyen de forcer le compilateur à accepter un type I à travers. Aucune suggestion? J'ai essayé aussi une déclaration de paramétrez cas, mais qui était un no go:
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
}
Toute idée de la façon de faire ce que je veux?
Votre 'MyDataType' ressemble à un' Manifest', une fonctionnalité incluse de Scala que vous devriez jeter un oeil à. – shellholic
MyDataType est similaire, même si en réalité il a des méthodes. C'est une classe de type que j'utilise. –