Scala泛型为泛型类型

时间:2016-12-14 16:34:59

标签: scala generics

假设我有这段代码。它不编译。编译器似乎认为foreach()中的e不是MyTrait的子类。

class MyCollection[T[A] <: MyTrait[A]](val iterable: Iterable[T]) extends Iterable[T]{
    override def iterator: Iterator[T] = ???
    def doStuffWithAll = iterable.foreach(e => e.doStuff)
}

trait MyTrait[T]{
    def doStuff = println("doing stuff")
}

这个集合是MyTrait实现集合的包装器,它将有一些方便的方法。我希望MyTrait也是通用的,并确保MyCollection仅包含带有type参数的MyTrait实现。那可能吗?

1 个答案:

答案 0 :(得分:0)

您可以使用MyTrait[A]作为类型来提供Iterator

class MyCollection[A](iterable: Iterable[MyTrait[A]]) extends Iterable[MyTrait[A]] {
  override def iterator: Iterator[MyTrait[A]] = ???
  def doStuffWithAll = iterable.foreach(_.doStuff)
}

如果您想按照尝试的方式进行操作,则忘记将A作为类型参数传递。

class MyCollection[A, T[A] <: MyTrait[A]](iterable: Iterable[T[A]]) extends Iterable[T[A]] {
  override def iterator: Iterator[T[A]] = ???
  def doStuffWithAll = iterable.foreach(_.doStuff)
}