加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何让隐式转换在集合中工作?

发布时间:2020-12-16 09:13:44 所属栏目:安全 来源:网络整理
导读:说我有一个隐式的转换: implicit def aToB(a: A):B={...} 如何让这个隐式转换工作在列表的元素? 如果我有: val listOfA: List[A] ... 并且我有一个功能需要一个B的列表,是否可以让Scala隐含地将所有的元素从A转换为B? 没有隐式转换,转换可能如下所示: l
说我有一个隐式的转换:

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读