隐式别名和扩展scala Seq
发布时间:2020-12-16 10:03:52 所属栏目:安全 来源:网络整理
导读:我有以下内容: case class Bar()trait Foo { def bars : Seq[Bar]}case class MyFoo(bars : Seq[Bar]) extends Footrait Foos extends Seq[Foo] { def bars : Seq[Bar] = this.map(_.bars).flatten} 我想将Seq [MyFoo]的对象转换为MyFoos,最好是隐式.怎么能
我有以下内容:
case class Bar() trait Foo { def bars : Seq[Bar] } case class MyFoo(bars : Seq[Bar]) extends Foo trait Foos extends Seq[Foo] { def bars : Seq[Bar] = this.map(_.bars).flatten } 我想将Seq [MyFoo]的对象转换为MyFoos,最好是隐式.怎么能实现这个目标? 例如. val foos : Foos = Seq(new MyFoo(Seq(new Bar))) 解决方法
你可以这样做:
case class Bar() trait Foo { def bars : Seq[Bar] } case class MyFoo(bars : Seq[Bar]) extends Foo trait Foos extends Seq[Foo] { def bars : Seq[Bar] = this.map(_.bars).flatten } implicit def seqMyFooToMyFoos(myFoos:Seq[Foo]) = new Foos { def length: Int = myFoos.length def apply(idx: Int): Foo = myFoos(idx) def iterator: Iterator[Foo] = myFoos.iterator } val foos : Foos = Seq(new MyFoo(Seq(new Bar))) // Uses implicit conversion UPDATE 这可能是您正在寻找的更多内容: trait Foos { def bars : Seq[Bar] } implicit def seqMyFooToMyFoos(myFoo:Seq[MyFoo]) = new Foos { def bars : Seq[Bar] = myFoo.map(_.bars).flatten } val foos = Seq(new MyFoo(Seq(new Bar))) foos.bars 更新2 如果您使用的是scala 2.10,则可以使用隐式类并删除Foos特征: implicit class GetAllBars(myFoo:Seq[MyFoo]) { def bars : Seq[Bar] = myFoo.map(_.bars).flatten } val foos = Seq(new MyFoo(Seq(new Bar))) foos.bars (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |