À l'aide de cas générique classes Scala
Je me demande si l'utilisation de génériques pour Scala classes de cas pouvez enregistrer un peu de code réutilisable.
Sauvons j'ai la classe suivante hiérarchie pour émuler une "variante" type de boîtes d'un ensemble de types et permet unboxing eux à l'aide de la correspondance de motif:
sealed abstract class Box;
case class DoubleBox(v: Double) extends Box;
case class StringBox(v: String) extends Box;
case class BooleanBox(v: Boolean) extends Box;
def typeName(b: Box) = b match {
case DoubleBox(v) => "Double"
case StringBox(v) => "String"
case BooleanBox(v) => "Boolean"
case _ => "Unknown"
}
Il peut y avoir des endroits dans le code, là où il serait plus pratique de travailler avec la feuille de cas des classes si elles étaient des génériques. Quelque chose comme:
sealed abstract class Box;
case class TypedBox[T](v: T) extends Box;
def typeName2(b: Box) = b match {
case TypedBox[Double](v) => "Double"
case TypedBox[String](v) => "String"
case TypedBox[Boolean](v) => "Boolean"
case _ => "Unknown"
}
Mais cela ne veut pas compiler. Autant je comprends cette syntaxe n'est pas vraiment reconnu comme valide Scala de syntaxe.
Est-il possible de faire ce que je veux de travail ou c'est une mauvaise idée et je n'arrive pas à obtenir quelque chose?
EDIT: Vinicius répondu à ma question, mais en regardant la réponse j'ai une autre question. Est-il possible de faire allusion le compilateur en quelque sorte que seuls certains liste des types peuvent être utilisés à des paramètres TypedBox? Je veux que, pour s'assurer que le compilateur peut toujours faire vérifier l'exhaustivité de TypedBox de l'utilisation/de correspondance.
OriginalL'auteur Alexey Alexandrov | 2013-09-17
Vous devez vous connecter pour publier un commentaire.
Essayer
OriginalL'auteur Vinicius Miana
Pour la deuxième partie de la question, il y a deux façons de limiter les types autorisés.
La première serait de mettre une limite sur le type, qui permettrait de limiter les admissibles, mais ne serait pas permettre au compilateur de ne significatif de l'exhaustivité des contrôles que les types pourrait être défini assez beaucoup n'importe où, ni n'importe quel moment.
La deuxième serait pour envelopper le type dans un récipient hermétique trait, mais alors vous êtes essentiellement la création d'une classe de cas pour chaque type, de sorte que vous pourriez aussi bien enlever la couche supplémentaire de l'emballage et simplement créer
DoubleBox
,StringBox
, etc.OriginalL'auteur Morgen