Scala - pattern-matching d'un n-uplet de types
J'ai la classe suivante hiérarchie:
class A
class B extends A
class C extends A
puis, il y a une autre classe qui prend des instances de ces classes et il y a une méthode, dans lequel les deux cas de pattern-matching sont possibles comme ceci:
class D (one: A, two: A) {
def work {
(one, two) match {
case (o, t): (B, B) => ... blablabla
case (o, t): (B, C) => ... blablabla
case _ =>
}
}
}
Cependant, lorsqu'il doit résoudre la mise en correspondance en faveur du second cas (B, C)
, il essaie de le résoudre comme (B, B)
et vient à la classe de fonte sauf que C cannot be cast to B
. Pourquoi? Que faire? Comment puis-je contourner cela?
Vous devez vous connecter pour publier un commentaire.
Votre syntaxe n'est pas tout à fait bon (ne compile pas).
Cela fonctionne bien:
Le problème, comme toujours, est effacée types.
(B,C)
est sucre syntaxique pourTuple2[B,C]
, qui est effacée àTuple2
au moment de l'exécution. L'instruction de cas, vérifie que(B,C)
correspondTuple2
, mais ne parvient pas à jeter.Dans votre cas, la solution la plus simple serait de match contre le " un " et "deux" individuellement, plutôt que de les envelopper dans un tuple:
Il n'est pas si jolie, mais il ne souffre pas du même problème.
Edit: en Fait, j'irais avec Brian Smith solution correspondant à l'intérieur de la n-uplet plutôt qu'à l'extérieur. Il permet d'éviter le problème d'une manière similaire, mais ressemble plus belle.
J'ai fait ce code de travail.
Tout d'abord, j'ai ajouté un cas à la définition de classe.
Deuxièmement, j'ai changé le
work
.Maintenant ce que j'ai:
La
case
ajoute une applique et une délettrer méthode.