1, "b" -> 1) val test1: Iterable-6ren">
gpt4 book ai didi

scala - 为什么这个Iterable在映射后会产生一个Set?

转载 作者:行者123 更新时间:2023-12-04 23:40:26 24 4
gpt4 key购买 nike

在下面的示例代码中,为什么 Iterable[String] test1映射后产生一个集合?

val foo = Map("a" -> 1, "b" -> 1)
val test1: Iterable[String] = foo.keys
val test2: Iterator[String] = foo.keys.toIterator

println(test1.map(foo).size) // 1
println(test2.map(foo).size) // 2

我对此感到困惑,因为它在阅读代码时完全违反直觉。即使 foo.keys只返回一个 Iterable,它在调用 map 时创建一个 Set ,如反射代码所示:
println(test1.map(foo).getClass.getName) // immutable.Set.Set1
println(test2.map(foo).getClass.getName) // Iterator$$anon$11

标准库如何确定它应该创建一个 immutable.Set在这里,即使推断的集合类型只是 Iterable[String] ?

最佳答案

foo.keys返回 Set (尽管它的返回类型更通用)并在 Set 上调用 map产生另一个 Set .推断或编译时类型并不总是最精确的。

您可以看到 keys Set 上的方法返回 Set即使返回类型是 Iterable[A] :

scala> Map(1 -> 2).keys
res0: Iterable[Int] = Set(1)

关于scala - 为什么这个Iterable在映射后会产生一个Set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39056078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com