Voici quelques alternatives que vous pourriez envisager :
1. Utiliser une vue liée
S'il est possible de modifier la fonction qui prend une liste de B, ce serait la solution la plus simple. Modifiez-la pour qu'elle accepte une liste de choses qui peuvent être converties en B. C'est-à-dire,
def yourFn(l: List[B]) = ...
deviendrait
def yourFn[X <% B](l: List[X]) = ...
Ensuite, vous pouvez simplement appeler la fonction avec listOfA :
yourFn(listOfA)
2. Introduire une méthode de conversion
Cette solution est similaire à la première solution de Rogach, sauf que la conversion externe est non implicite :
def convert[B, A <% B](l: List[A]): List[B] = l map { a => a: B }
Ensuite, sur le site d'appel de votre fonction, vous écrirez
yourFn(convert(listOfA))
Comme la deuxième solution de Rogach, cette solution est un peu plus sûre que l'introduction d'une conversion implicite.
3. Introduire une conversion implicite
Ceci est équivalent à la première solution de Rogach, mais la notation est un peu plus agréable (IMO).
implicit def convert[B, A <% B](l: List[A]): List[B] = l map { a => a: B }
Si cette conversion est dans la portée de votre site d'appel, vous pouvez simplement appeler votre fonction avec le listOfA :
yourFn(listOfA)
Réflexions sur l'avenir
Il est intéressant d'examiner comment résoudre ce problème de manière générale. Que se passe-t-il si je veux définir ma méthode de conversion de façon à ce qu'elle puisse traiter n'importe quel type qui implémente la fonction map
méthode ? c'est-à-dire,
def convert[B, A <% B, C[_]](c: C[A]): C[B] = c map { a => a: B }
Cela ne fonctionnera pas, bien sûr, puisque rien dans la signature n'exprime la contrainte que C
doit mettre en œuvre map
. Pour autant que je sache, l'expression de cette contrainte est assez complexe et ne peut pas être faite de manière à fournir un support prêt à l'emploi pour tout type qui implémente map
. Voir Compréhensions de séquences Scala sûres pour les types .