范围内过滤方法的实际返回类型是什么?如何使其成为向量?

Sim*_*onD 1 scala

我是Scala的新手,请多多包涵!我正在做一些Scala练习,其中之一是创建一个从1到20的奇数列表。这很简单,但是我filter对范围内方法的返回类型有些困惑。

我有以下块:

val lst2 = (1 to 20).filter(_ % 2 != 0)
println(lst2)
Run Code Online (Sandbox Code Playgroud)

输出为:

向量(1、3、5、7、9、11、13、15、17、19)

然而,当我明确设置的类型lst2,以Vector[Int]类似如下:

val lst2: Vector[Int] = (1 to 20).filter(_ % 2 != 0)
println(lst2)
Run Code Online (Sandbox Code Playgroud)

我得到这个:

16:错误:类型不匹配;

找到:scala.collection.immutable.IndexedSeq [Int]

必需:Vector [Int] val lst2:Vector [Int] =(1至20).filter(_%2!= 0)^找到一个错误

那么,这里发生了什么?该println方法只是没有给我正确的类型?如何获取filter方法以返回Vector?

And*_*kin 5

filterof 提供的唯一保证是Range它返回a collection.immutable.IndexedSeq[A],因此将编译:

val lst2: collection.immutable.IndexedSeq[Int] = (1 to 20).filter(_ % 2 == 1)
Run Code Online (Sandbox Code Playgroud)

在运行时,lst2只是碰巧是一个Vector[Int],但这不是由接口保证,所以该报告的作者filter方法有效地保留了具体的实施改变到另一个权IndexedSeq只要他们喜欢。类型Vector是您不应该依赖的实现细节。

之所以这样打印,Vector(...)是因为它取决于toString在运行时出现的具体实例的实现,而不是静态已知的类型(动态调度)。

如果您确实想要带type的东西Vector,只需追加.toVector

val lst2: Vector[Int] = (0 to 20).filter(_ % 2 == 1).toVector
Run Code Online (Sandbox Code Playgroud)