У меня есть следующий код:
case class Foo[+CC[A] <: Iterable[A]](foo: CC[Int])
def customReduce[CC1[A] <: Iterable[A], CC2[A] <: Iterable[A]](foos: CC1[Foo[CC2]]): Foo[CC1] =
Foo(foos.flatMap(_.foo))
println(customReduce(Seq(Foo(Seq(1)))))
Foo - это тип, который принимает любой тип коллекции. Когда я выполняю customReduce, вызов foos.flatMap
должен возвращать тот же тип, что и foos, то есть CC1[Foo[CC2]]
, но компилятор разрешает его до базового Iterable
и жалуется:
type mismatch;
found : Iterable[Int]
required: CC1[Int]
Почему это происходит и как я могу это решить?
EDIT: похоже, что после того, как Iterable расширяет IterableOps, тип CC фиксируется на Itearble. Как я могу заставить вышеуказанный код работать?