我是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?
由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)
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |