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

时间:2019-03-15 16:28:54

标签: scala

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

我有以下内容:

val lst2 = (1 to 20).filter(_ % 2 != 0)
println(lst2)

此输出为:

  

Vector(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)

我得到这个:

  

16:错误:类型不匹配;

     

发现:scala.collection.immutable.IndexedSeq [Int]

     

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

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

1 个答案:

答案 0 :(得分:5)

filter的{​​{1}}提供的唯一保证是它返回一个Range,因此可以编译:

collection.immutable.IndexedSeq[A]

在运行时,val lst2: collection.immutable.IndexedSeq[Int] = (1 to 20).filter(_ % 2 == 1) 只是可能是一个lst2,但这不能由接口保证,因此Vector[Int]方法的作者有效地保留随时将具体实现更改为另一个filter的权利。 IndexedSeq类型是您不应该依赖的实现细节。

将其打印为Vector的原因是它取决于运行时存在的具体实例的Vector(...)的实现,而不是静态已知类型(动态调度)的实现。

如果您确实想要类型为toString的东西,只需附加Vector

.toVector