scala – 如何让隐式转换在集合中工作?
说我有一个隐式的转换:
implicit def aToB(a: A):B={ ... } 如何让这个隐式转换工作在列表的元素? 如果我有: val listOfA: List[A] ... 并且我有一个功能需要一个B的列表,是否可以让Scala隐含地将所有的元素从A转换为B? 没有隐式转换,转换可能如下所示: lisftOfA.map(a => new B(a.someValue,a.anotherValue)) 但是我很想这样发生像“魔术”…是太多要问了. 解决方法
以下是您可能需要考虑的几个选择:
1.使用视图绑定 如果可以改变使用B列表的功能,这将是最简单的解决方案.修改它以接受可以转换为B的事物列表.那是, 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) 分离思想 有趣的是考虑如何以一般的方式解决这个问题.如果我想定义我的转换方法,以便它可以处理实现地图方法的任何类型怎么办?即, def convert[B,A <% B,C[_]](c: C[A]): C[B] = c map { a => a: B } 这当然不起作用,因为签名中没有任何内容表示C必须实现映射的约束.据我所知,表达这个约束是相当涉及的,不能以为实现地图的任何类型提供现成支持的方式来完成.见Type-safe Scala sequence comprehensions. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |