0
votes

Un moyen d'éviter l'asinversion de Scala

J'ai cette hiérarchie de traits et de classes à Scala: xxx

Je ne peux pas modifier la hiérarchie de type ou le type de liste.

y a-t-il une meilleure façon Pour éviter la déclaration d'asinversance de [B [_]]]?


3 commentaires

Pouvez-vous déclarer la liste l comme list [b [_]] dès le début, la déclarer explicitement la déclarant comme list [a] ?


Si vous ne pouvez pas modifier le type de liste, comment êtes-vous sûr que toutes les instances seront de type B ? Que devrait-il arriver si une instance n'est pas de type B ?, 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.


3 Réponses :


6
votes

Vous pouvez essayer la correspondance de motif.

l.collect{case x :B[_] => println(x.v)}


3 commentaires

Cela se bloque avec un MatchError si la liste n'est pas réellement liste [b [_]] .


Ok ... pourquoi collectez-vous des listes d'inutiles () -values ​​maintenant?


Je laisse mon chat jouer avec eux avant de les jeter.



4
votes

Vous pouvez essayer quelque chose comme ceci: xxx

Il ne nécessite aucun isinstance de ou asinstance de et ne se bloque jamais, même Si votre liste contient A S n'est pas b [_] s. Il ne crée pas non plus de longues listes comme résultats intermédiaires, seulement une petite option s.


pas aussi concise, mais aussi une solution beaucoup moins surprenante: < / p> xxx


si vous pouvez modifier le type de l à list [b [_]] , ce serait être la solution préférable.


1 commentaires

Au cas où la uppote / Unupvote a été causée par le doute si le motif réfutable B: B [_] peut être utilisé dans pour directement pour ajouter un withfilter Étape: Apparemment, il ne peut pas: pour (B: B [_] <- L) {...} ne compile pas. Au moins, je ne sais pas comment le forcer à compiler.



1
votes

Je pense que la manière la plus idéale de le faire serait de fournir B avec un objet extracteur et une correspondance de modèle pour B valeurs: xxx

Si B 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.


0 commentaires