Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
隐式别名和扩展scala Seq_Scala_Implicit Conversion - Fatal编程技术网

隐式别名和扩展scala Seq

隐式别名和扩展scala Seq,scala,implicit-conversion,Scala,Implicit Conversion,我有以下资料: 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,最好是隐式转换。如何做到这一点 例如 你可以这样做: case

我有以下资料:

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
,最好是隐式转换。如何做到这一点

例如


你可以这样做:

  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
更新

这可能更符合您的需求:

  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

你的意思是说特征条;trait MyFoo{def bars:Seq[Bar]}?我更新了描述我更新了描述,尽管我不确定它是否会改变你的答案。隐式方法是否必须创建一个代理所有Seq方法的具体对象?这也是无法推断的?因为您要在Foos中扩展Seq,所以需要。您可以选择不在Foos中扩展Seq[Foo],在需要进行隐式转换时,您将获得默认的Seq实现和bars方法。由于我仍然希望最终类型具有Seq[Foo]特性,我想我仍然需要在所有3种情况下实现这些方法。没关系,尽管我希望有一种方法可以做一些类似类型别名(type Foos=Seq[Foo])的事情,但也可以在中添加一个方法。不过,这个答案很好,谢谢!
  implicit class GetAllBars(myFoo:Seq[MyFoo]) {
    def bars : Seq[Bar] = myFoo.map(_.bars).flatten
  }

  val foos = Seq(new MyFoo(Seq(new Bar)))

  foos.bars