Scala3 如何实现泛型zipWith扩展方法及现有实现报错排查
Scala zipWith 扩展方法报错分析与修复
报错根因
你代码中的泛型约束存在类型关联缺失问题:
C[_] <: Iterable[_]声明里的两个下划线都是独立的匿名存在类型,编译器无法建立「C的元素类型」「Iterable的元素类型」和你声明的泛型参数A的关联- 此时编译器只能将传入的
s: C[A]推导为Iterable[Any]类型,调用map方法时参数x被判定为Any类型,和期望的A类型不匹配,触发类型错误
修复方案
通用全集合兼容版本
如果需要支持所有Iterable子类(List、Set、Vector等),可以通过IterableOps约束保证map操作后返回原集合类型,代码如下:
import scala.collection.IterableOps extension[A, C[X] <: IterableOps[X, C, C[X]]] (s: C[A]) def zipWith[B](f: A => B): C[(A, B)] = s.map(x => (x, f(x)))
简化单集合版本
如果只需要给特定集合(比如List)使用,可以直接简化约束,避免复杂的泛型声明:
extension[A] (s: List[A]) def zipWith[B](f: A => B): List[(A, B)] = s.map(x => (x, f(x)))
效果验证
调用List(1,2,3) zipWith (_ * 2) 即可得到预期输出:List((1,2), (2,4), (3,6))
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

