我是scala的新手(刚刚开始学习它),但我发现了一些奇怪的东西:有类Array和List,它们都有foreach
,{{1}这样的方法/函数},forall
等。但是这些方法中的任何一个都不是从某些特殊类(trait)继承而来的。从java的角度来看,如果map
和Array
提供了一些契约,那么该契约必须在接口中声明,并且部分在抽象类中实现。为什么在scala中每个类型(Array和List)声明自己的方法集?为什么他们没有一些共同的类型?
答案 0 :(得分:8)
但是这些方法中的任何一个都不是从某些特殊类(特征)继承的
这根本不是真的。
如果你打开scaladoc并查找说出.map
数组和列表的方法,然后点击它,你会看到它的定义位置:
列表:
对于数组:
另请参阅有关Traversable和Iterable的信息,这两个信息都定义了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提供的类型层次结构的限制。
现在,回到foreach
,map
等,它们不是 Java 中存在的方法。但是,Scala允许用户将隐式转换从一个类添加到另一个类,并通过该机制添加方法。当您致电arr.foreach(println)
时,真正做的是Predef.refArrayOps(arr).foreach(println)
,这意味着foreach
属于ArrayOps
类 - 正如您在scaladoc文档中所看到的那样。