J'ai cette hiérarchie de traits et de classes à Scala: Je ne peux pas modifier la hiérarchie de type ou le type de liste. P> y a-t-il une meilleure façon Pour éviter la déclaration d'asinversance de [B [_]]]? p> p>
3 Réponses :
Vous pouvez essayer la correspondance de motif.
l.collect{case x :B[_] => println(x.v)}
Cela se bloque avec un MatchError CODE> si la liste n'est pas réellement
liste [b [_]] code>.
Ok ... pourquoi collectez-vous des listes d'inutiles () code> -values maintenant?
Je laisse mon chat jouer avec eux avant de les jeter.
Vous pouvez essayer quelque chose comme ceci: Il ne nécessite aucun pas aussi concise, mais aussi une solution beaucoup moins surprenante: < / p> si vous pouvez modifier le type de isinstance de code> ou
asinstance de code> et ne se bloque jamais, même Si votre liste contient
A code> S n'est pas
b [_] code> s. Il ne crée pas non plus de longues listes comme résultats intermédiaires, seulement une petite option
code> s. P>
l code> à
list [b [_]] code>, ce serait être la solution préférable. p> p>
Au cas où la uppote / Unupvote a été causée par le doute si le motif réfutable B: B [_] code> peut être utilisé dans
pour code> directement pour ajouter un
withfilter Code> Étape: Apparemment, il ne peut pas:
pour (B: B [_] <- L) {...} code> ne compile pas. Au moins, je ne sais pas comment le forcer à compiler.
Je pense que la manière la plus idéale de le faire serait de fournir Si B code> avec un objet extracteur et une correspondance de modèle pour
B code> valeurs:
B code> est déclaré dans un fichier source que vous ne pouvez pas modifier, vous pourriez avoir besoin d'un nom différent de l'objet Extractor. P> P>
Pouvez-vous déclarer la liste
l code> comme
list [b [_]] code> dès le début, la déclarer explicitement la déclarant comme
list [a] code>?
Si vous ne pouvez pas modifier le type de liste, comment êtes-vous sûr que toutes les instances seront de type
B code>? Que devrait-il arriver si une instance n'est pas de type
B code>?, L'ignore et continue? Échouer avec une exception?
Je ne peux pas changer le type de liste. Ignorez simplement si quelque chose n'est pas de type B.