假设我有这段代码。它不编译。编译器似乎认为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实现。那可能吗?
答案 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)
}