Scala中如何编写泛型Iterator的mapInner扩展且不丢失类型信息
解决嵌套集合扩展方法的类型保留问题
首先纠正你代码里的几个语法错误:exstension拼写应为extension,参数和方法定义的括号都未闭合。原实现的核心问题是直接绑定到Iterator[Iterator[A]]类型,任何嵌套集合(比如List[List[Int]])调用时都会被隐式转换为Iterator,自然丢失了原集合类型。
要实现保留原类型的mapInner,需要利用Scala的BuildFrom类型类,它能根据输入集合的类型,构建出同类型的输出集合。以下是Scala 3的正确实现:
import scala.collection.BuildFrom extension [F[_], G[_], A](outer: F[G[A]]) def mapInner[B](f: A => B)(using bfOuter: BuildFrom[F[G[A]], G[B], F[G[B]]], bfInner: BuildFrom[G[A], B, G[B]] ): F[G[B]] = outer.map { inner => inner.map(f) }
关键说明
- 泛型参数
F[_]和G[_]分别代表外层和内层的集合类型(比如List和List,或者Vector和Array) using子句引入的BuildFrom实例,负责根据原集合类型生成对应类型的新集合,避免类型丢失- 外层调用
map处理每个内层集合,内层调用map转换元素,最终返回和输入同结构的嵌套集合
示例用法
val nums = List(List(1, 2, 3), List(4, 5, 6)) val doubled = nums.mapInner(_ * 2) // doubled 类型为 List[List[Int]],值为 List(List(2,4,6), List(8,10,12)) val vecs = Vector(Vector("a", "b"), Vector("c", "d")) val upper = vecs.mapInner(_.toUpperCase) // upper 类型为 Vector[Vector[String]],值为 Vector(Vector("A","B"), Vector("C","D"))
如果是Scala 2环境,可替换为CanBuildFrom类型类,核心逻辑一致,只是语法略有差异。
内容的提问来源于stack exchange,提问作者solomon alon
相关产品推荐
相关产品推荐

