2011-01-30 39 views
2

我正在收集API和返回的操作类型,它可以修改容器的类型和被包含元素的类型,使其非用例表单中的所有标题类似于以下内容:只是另一个canBuildFrom问题

def map [B, That] (f: (A) ⇒ B)(implicit bf: CanBuildFrom[List[A], B, That]):That
显而易见的是,对于 That(如果 BitSet回退到 Set,如果所包含的项目更改为 Int以外的其他收集类型)肯定存在'后退'。但是,如何确定物品的类型?我期望返回类型为 That[B],但事实并非如此。为什么?请教育我:-)

回答

3

您已经自己给出了答案:如果您希望在适当的情况下能够返回BitSet,则需要在返回类型中删除该类型参数。显然没有BitSet[Int]

你需要的所有信息都已经被适当CanBuildFrom implicits具有类型CanBuildFrom[Coll, A, Traversable[A]]的后备定义处理(或任何可能超过Traversable在类型层次结构)。

当然,CanBuildFrom必须是合理的,但我认为它实际上可以滥用它并返回一个真正奇怪的That。尽管如此,默认值是相当理智的。