在以下两个场景中,我在列表上调用了 flatMap 函数。在这两种情况下,flatMap 函数的映射部分都会返回一个包含迭代器的数组。在第一种情况下,代码会出错,而在第二种情况下,它会产生预期的结果。
场景一
val x = List("abc","cde")
x flatMap ( e => e.toArray)
<console>:13: error: polymorphic expression cannot be instantiated to expected type;
found : [B >: Char]Array[B]
required: scala.collection.GenTraversableOnce[?]
x flatMap ( e => e.toArray)
场景 2
val x = List("abc,def")
x flatMap ( e => e.split(",") )
res1: List[String] = List(abc, def) //Result
请问为什么在第一种情况下,它没有按预期运行?
请您参考如下方法:
我认为不同之处在于,在场景 1 中,您实际上有一个 Array[B]
,其中 B
是 的某个尚未确定的父类(super class)型字符
。通常,编译器会寻找到 GenTraversableOnce
的隐式转换,但由于 B
尚不清楚,您会遇到类型推断问题/限制。
您可以通过填写 B
来帮助类型推断。
List("abc", "cde").flatMap(_.toArray[Char])
或者更好的是,在这种情况下您不需要 flatMap
。只需调用 flatten
。
List("abc", "cde").flatten