【发布时间】:2020-08-05 09:07:32
【问题描述】:
我有以下代码:
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]
为什么会发生这种情况,我该如何解决?
编辑:似乎在 Iterable 扩展了 IterableOps 之后,CC 类型固定为 Itearble。我怎样才能使上面的代码工作?
【问题讨论】:
-
您真的需要支持任何集合类型吗?编写适用于任何集合的代码是一种痛苦,并且在
2.13+和2.12-中是不同的(因此您可能希望在问题中包含您的 Scala 版本) i> - 我只会使用具体类型或使用更好的抽象,例如来自 cats 的Monad。