我是 scala 的新手(刚开始学习它),但发现对我来说很奇怪:有类 Array 和 List,它们都有这样的方法/函数foreach
,forall
等等map
。但是这些方法中的任何一个都不是继承的来自一些特殊的类(特征)。从 java 的角度来看,如果Array
并List
提供一些契约,则该契约必须在接口中声明并在抽象类中部分实现。为什么在scala中每种类型(数组和列表)都声明自己的一组方法?为什么他们没有一些共同的类型?
2 回答
但是这些方法中的任何一个都不是从某些特殊的类(特征)继承的
那根本不是真的。
如果您打开 scaladoc 并查找.map
Array 和 List 的方法,然后单击它,您将看到它的定义位置:
对于列表:
对于数组:
另请参阅有关Traversable和Iterable的信息,它们都定义了 scala 集合中的大多数合同(但某些集合可能会重新实现 Traversable/Iterable 中定义的方法,例如为了提高效率)。
通常,您可能还想查看集合之间的关系(滚动到两个图表)。
我将在这里扩展 om-nom-nom 答案。
Scala 没有Array
- 那是Java Array
,JavaArray
没有实现任何接口。事实上,如果我没记错的话,它甚至不是一个合适的类,而且它肯定是通过字节码级别的特殊机制实现的。
然而,在 Scala 上,一切都是类—— Int
(Java 的int
)是类,而Array
. 但是在这些实际类来自 Java 的情况下,Scala 受到 Java 提供的类型层次结构的限制。
现在,回到foreach
,map
等,它们不是Java中存在的方法。但是,Scala 允许添加从一个类到另一个类的隐式转换,并通过该机制添加方法。当您调用arr.foreach(println)
时,真正完成的是Predef.refArrayOps(arr).foreach(println)
,这意味着foreach
属于ArrayOps
该类 - 正如您在 scaladoc 文档中看到的那样。