常见于scala的数组和列表中

时间:2013-02-19 22:49:34

标签: scala

我是scala的新手(刚刚开始学习它),但我发现了一些奇怪的东西:有类Array和List,它们都有foreach,{{1}这样的方法/函数},forall等。但是这些方法中的任何一个都不是从某些特殊类(trait)继承而来的。从java的角度来看,如果mapArray提供了一些契约,那么该契约必须在接口中声明,并且部分在抽象类中实现。为什么在scala中每个类型(Array和List)声明自己的方法集?为什么他们没有一些共同的类型?

2 个答案:

答案 0 :(得分:8)

但是这些方法中的任何一个都不是从某些特殊类(特征)继承的

这根本不是真的。

如果你打开scaladoc并查找说出.map数组和列表的方法,然后点击它,你会看到它的定义位置:

列表:

enter image description here

对于数组:

enter image description here

另请参阅有关TraversableIterable的信息,这两个信息都定义了scala集合中的大多数合同(但某些集合可能会重新实现Traversable / Iterable中定义的方法,例如效率)。 / p>

您可能还想查看relations between collections(滚动到两个图表)。

答案 1 :(得分:3)

我会在这里延伸om-nom-nom答案。

Scala没有Array - 那是 Java Array,而Java Array没有实现任何接口。事实上,如果我没有弄错的话,它甚至都不是一个合适的类,它肯定是通过字节码级别的特殊机制来实现的。

但是,在Scala上,一切都是一个类 - Int(Java的int)是一个类,Array也是如此。但在这些情况下,实际的类来自Java,Scala受Java提供的类型层次结构的限制。

现在,回到foreachmap等,它们不是 Java 中存在的方法。但是,Scala允许用户将隐式转换从一个类添加到另一个类,并通过该机制添加方法。当您致电arr.foreach(println)时,真正做的是Predef.refArrayOps(arr).foreach(println),这意味着foreach属于ArrayOps类 - 正如您在scaladoc文档中所看到的那样。