Puis-je effectuer une correspondance sur un paramètre de type dans Scala pour voir s'il implémente un trait?
Je voudrais avoir une méthode qui renvoie une classe d'un certain type, mais je veux la méthode pour se comporter différemment selon si oui ou non la classe étend un trait particulier comme suit:
case class ClassA extends TraitA
case class ClassB extends TraitB
case class ClassC extends TraitA
...
def myfunc[T]():T = {
T match {
case TraitA => //return new T in a particular way
case TraitB => //ditto
}
}
Est-ce possible, ou suis-je aller à ce sujet dans le mauvais sens?
Grâce
source d'informationauteur codefly
Vous devez vous connecter pour publier un commentaire.
On ne peut pas comparer directement les types, car il n'y a rien là à comparer (au moment de l'exécution, en raison de l'effacement). Vous pourriez travailler sur une représentation de votre classe:
ou vous pouvez en correspondance du modèle sur les instances de la classe:
Vous pouvez également utiliser la première approche d'un point de vue syntaxique moins gênant, par classe se manifeste:
et vous pouvez choisir différentes sortes d'expédition également si la si/d'autre devient wieldy:
Noter que tous les génériques de code que vous utilisez ce de aura besoin d'avoir une classe manifeste (soit comme un paramètre implicite, ou, pour être plus clair,
[T: ClassManifest]
."voulez la méthode pour se comporter différemment selon si oui ou non la classe étend un trait particulier"
C'est presque canonique description de l'héritage. Ne pouvez-vous pas avoir une méthode dans chaque trait de caractère qui encapsule le comportement différent que vous êtes après?
Vous avez besoin d'un exemple pour vérifier le type. Un générique en lui-même est juste un espace réservé pour un type. Vous pourriez faire quelque chose comme ceci: