是GenTraversableOnce [B]父类型的数组[文件]?

时间:2015-02-07 22:56:27

标签: scala inheritance

默认flatMap

def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): Array[B]

在目录中创建List个文件:

 def recursiveListFiles(f: File): Array[File] = {
    val these = f.listFiles
    these ++ these.filter(_.isDirectory).flatMap(f => recursiveListFiles(f))
  } 

flatMap接受一个函数参数,该参数也接受一个参数并返回  输入GenTraversableOnce[B]

Array&之间存在分层共同类型。 GenTraversableOnce好像没有链接,Array[File]不应该是GenTraversableOnce[B]的有效类型?

看着 Array API:http://www.scala-lang.org/api/2.10.4/#scala.Array

GenTraversableOnce API:http://www.scala-lang.org/api/2.10.4/#scala.collection.GenTraversableOnce

似乎没有链接?

2 个答案:

答案 0 :(得分:2)

ArrayArrayOps的隐式转换,继承GenTraversableOnce

来自ScalaDocs:

  

scala.Predef中经常存在两个隐式转换   应用于数组:转换为scala.collection.mutable.ArrayOps   (显示在上面例子的第4行)并转换为   scala.collection.mutable.WrappedArray(一个子类型   scala.collection.Seq)。两种类型都提供了许多标准   Scala集合API中的操作

至于两者之间的区别:

  

转换为ArrayOps是临时的,因为定义了所有操作   ArrayOps返回一个数组,而转换为WrappedArray则是   永久,因为所有操作都返回WrappedArray。

答案 1 :(得分:2)

Array的链接标量所述:

  

scala.Predef中存在两个经常应用于数组的隐式转换:转换为scala.collection.mutable.ArrayOps(显示在上面示例的第4行)和转换为scala.collection.mutable.WrappedArray( scala.collection.Seq的子类型。

Array不会从GenTraversableOnce继承,但Array ArrayOps scala.Predef ArrayOps隐式转换为GenTraversableOnce {} {3}}。 {{1}}确实继承自{{1}}。