List状态的文档:
结果集合的类型由静态类型的列表引导 . 这有时会导致意外结果 . 例如:// lettersOf将返回可能重复字母的Seq [Char],而不是Set def lettersOf(words:Seq [String])= words flatMap(word => word.toSet)// lettersOf将返回一个Set [Char],而不是Seq def lettersOf(words:Seq [String])= words.toSet flatMap(word => word.toSeq)
我很难理解这一点 . StringOps.toSet返回一组Char,所以第一个例子最终返回Char Seq - 罚款 . 那讲得通 . 我不遵循的是为什么在第二个例子中Scala构造一个Set而不是Seq .
“生成的集合是由静态类型的列表引导”究竟是什么意思?
1 回答
因为Set类中定义了canBuildFrom方法 . 正如您在ScalaDoc的CanBuildFrom特性中所看到的,它具有类型参数
CanBuildFrom[-From, -Elem, +To]
,其中:From - 请求创建构建器的基础集合的类型 .
Elem - 要创建的集合的元素类型 .
To - 要创建的集合的类型 .
基本上当你在set上调用flatMap函数时,它会隐式调用
Set.canBuildFrom[Char]
,返回一个Set[Char]
至于静态类型 . 当Scala想要在集合类型之间进行转换时,它会使用
CanBuildFrom
trait,这取决于集合的静态类型 .Updated for the comment
如果我们将-Xprint:typer添加到scala命令,我们可以看到在typer阶段之后Scala编译器如何解析在flatMap方法中使用的隐式方法Set.canBuildFrom [Char]