以下是您可能希望考虑的一些替代方案:
1.使用视图绑定
如果可以更改采用 B 列表的函数,这将是最简单的解决方案。修改它以接受可以转换为 Bs 的事物列表。也就是说,
def yourFn(l: List[B]) = ...
会变成
def yourFn[X <% B](l: List[X]) = ...
然后,您可以使用 listOfA 调用该函数:
yourFn(listOfA)
2。介绍一种转换方法
这类似于 Rogach 的第一个解决方案,只是外部转换是非隐式的:
def convert[B, A <% B](l: List[A]): List[B] = l map { a => a: B }
然后在你的函数调用点,你会写
yourFn(convert(listOfA))
与 Rogach 的第二个解决方案一样,这比引入隐式转换更安全。
3.引入隐式转换
这相当于 Rogach 的第一个解决方案,但表示法更好一些 (IMO)。
implicit def convert[B, A <% B](l: List[A]): List[B] = l map { a => a: B }
如果此转换在您的调用站点范围内,您可以使用 listOfA 调用您的函数:
yourFn(listOfA)
离别的想法
考虑如何以一般方式解决这个问题很有趣。如果我想定义我的转换方法以便它可以处理任何实现map 方法的类型怎么办?即,
def convert[B, A <% B, C[_]](c: C[A]): C[B] = c map { a => a: B }
这当然行不通,因为签名中没有任何内容表示C 必须实现map 的约束。据我所知,表达这个约束是相当复杂的,并且不能以一种为实现map 的任何类型提供开箱即用支持的方式来完成。见Type-safe Scala sequence comprehensions。