Scala中flatten方法的隐式函数toIterableOnce定义位置查询
问题:Scala中flatten方法依赖的隐式函数定义位置
flatten方法的定义如下:
override def flatten[B](implicit toIterableOnce: A => IterableOnce[B])
我的代码示例:
val myList = List(1,2,3) println(myList.map(x => List(x, 2*x)).flatten)
我的理解:调用flatten时需要一个隐式函数,以List[Int]为输入并返回IterableOnce[Int]。我未手动定义该函数但代码可正常运行,说明隐式函数已存在,想确认它的具体定义位置——原以为在Predef中但未找到。
解答
你的理解是对的:调用flatten确实需要List[Int] => IterableOnce[Int]的隐式函数,这个函数无需手动定义的原因很简单——List[Int]本身就实现了IterableOnce[Int]接口,编译器会自动提供向上转型的隐式转换,直接把List[Int]当作IterableOnce[Int]使用。
这个隐式转换的定义不在Predef里,而是来自Scala集合库的核心规则:
- 在Scala 2中,子类向父类的向上转型属于语言级别的隐式转换,由编译器自动推导完成;
- 在Scala 3中,这个转换由
scala.collection包下的given IterableOnceConversion[A, IterableOnce[A]]实例提供,本质是一个身份转换,直接返回输入的集合本身。
对应你的代码来看:myList.map(x => List(x, 2*x))生成的是List[List[Int]],调用flatten时,每个元素List[Int]都能直接适配IterableOnce[Int]的要求,因此不需要额外定义隐式函数。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

