我是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?
答案 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