泛型 – Scala的含义是否可以转换为更高级别的类型?
发布时间:2020-12-16 09:05:13 所属栏目:安全 来源:网络整理
导读:假设我有一个名为LongArrayWritable的类型,它是一个Longs数组的盒装表示.我有隐式定义,在这些类型之间转换: implicit def boxLongArray(array: Array[Long]) : LongArrayWritable { /*elided*/}implicit def unboxLongArray(array: LongArrayWritable) : Ar
假设我有一个名为LongArrayWritable的类型,它是一个Longs数组的盒装表示.我有隐式定义,在这些类型之间转换:
implicit def boxLongArray(array: Array[Long]) : LongArrayWritable { /*elided*/} implicit def unboxLongArray(array: LongArrayWritable) : Array[Long] { /*elided*/} 现在,我也有一些暗示,它们以通用形式在java.lang.Iterable和scala.collection.List [X]之间进行转换: implicit def iterator2list[X](it : java.lang.Iterable[X]) : List[X] { /* elided */ } implicit def list2iterator[X](list : List[X]) : java.lang.Iterable[X] { /* elided */ } 使用这些定义,scala编译器可以推断java.lang.Iterable [LongArrayWritable]和List [Array [Long]]之间的隐式转换(相当于iterator2list(iterator).map(unboxLongArray(_))),或者这是超出implicits的能力,因此需要它自己的(显式?)隐式定义? 谢谢, 蒂姆 解决方法
有一篇帖子涵盖了这个问题:
How can I chain implicits in Scala?.实质上,您需要有一个绑定转换为LongArrayWritable的视图.这意味着,转换为LongArrayWritable的隐式def接收一个隐式参数(称为视图绑定),因此该def的参数不是直接的Array,而是某些可以转换为Array的类型:
object LongArrayWritable { implicit def fromArraySource[A <% Array[Long]](a: A): LongArrayWritable = apply(a) } case class LongArrayWritable(a: Array[Long]) def test(a: LongArrayWritable): Unit = println("OK") 现在这适用于数组: test(Array( 1L,2L,3L)) 但是,由于Array不是Iterable,并且在范围内没有从Iterable到Array的默认转换,您需要添加一个: implicit def iterable2Array[A: ClassManifest](i: Iterable[A]): Array[A] = i.toArray 然后它工作: test(List(1L,3L)) 视图边界A<%Array [Long]是类型A =>的隐式参数的快捷方式.数组[长],所以你也可以写 implicit def fromArraySource[A](a: A)(implicit view: A => Array[Long]) ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – Angular JS break ForEach
- scala – 是否可以创建一个可以用作T [A,B]的泛型类型T [A
- bootstrap模态框(modal)使用remote方法加载数据,只能加载
- angular – 如何在其他组件中排除app.component.html的代码
- Scala:从通用类型到第二类型的隐式转换
- Vim – 如何将搜索结果移动到文件的开头?
- Angular ngx-echarts图表
- bash – 在Emacs中的脚本中着色/缩进脚本
- Bootstrap3.0学习第十八轮(JavaScript插件——下拉菜单)
- 如何使用容器自动删除自动重启Docker容器?