【发布时间】:2020-08-17 16:14:28
【问题描述】:
在以下两个场景中,我在列表上调用了 flatMap 函数。在这两种情况下,flatMap 函数的 map 部分都返回一个包含迭代器的数组。在第一种情况下,代码会出错,而在第二种情况下,它会产生预期的结果。
场景一
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
你能帮忙解释一下为什么在第一种情况下,它的行为不像预期的那样吗?
【问题讨论】:
-
有趣。
flatMap()不会压平List[Array[Char]](场景 1),但它会压平List[Array[String]](场景 2)。在这两种情况下,如果您将flatMap()更改为map(),然后在末尾添加.flatten,它们都可以工作。 -
@jwvh 是的,可以正常工作。我对上述情况感到有些困惑。
-
我认为不同之处在于,在场景 1 中,您实际上有一个
Array[B],其中B是Char的一些尚未确定的超类型,结合搜索从Array到GenTraversableOnce的隐式转换会导致类型推断问题。顺便说一句,你可以打电话给List("abc", "cde").flatten。