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> commelist [b [_]] code> dès le début, la déclarer explicitement la déclarant commelist [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 typeB 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.