1

我是 scala 的新手(刚开始学习它),但发现对我来说很奇怪:有类 Array 和 List,它们都有这样的方法/函数foreachforall等等map。但是这些方法中的任何一个都不是继承的来自一些特殊的类(特征)。从 java 的角度来看,如果ArrayList提供一些契约,则该契约必须在接口中声明并在抽象类中部分实现。为什么在scala中每种类型(数组和列表)都声明自己的一组方法?为什么他们没有一些共同的类型?

4

2 回答 2

8

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

那根本不是真的。

如果您打开 scaladoc 并查找.mapArray 和 List 的方法,然后单击它,您将看到它的定义位置:

对于列表:

在此处输入图像描述

对于数组:

在此处输入图像描述

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

通常,您可能还想查看集合之间的关系(滚动到两个图表)。

于 2013-02-19T22:55:48.917 回答
3

我将在这里扩展 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 文档中看到的那样。

于 2013-02-19T23:16:33.997 回答